[中級] プログラミングでの分岐

  • テキストの使用
  • ブロックUIプログラミングツールでの整数と小数の扱い
  • 四角推の体積を計算する公式
  • 分岐の構文
  • 分岐の「条件」での「不等号」

今回は、ブロックUIプログラミングツールの中級編の最後になります。
前回は構文として「ループ」を使いました。
これに加えて「分岐」を扱います。

今回の最終課題は、ブロックUIプログラミングツールを使って以下のような形状を配置するプログラムを行います。

ピラミッドの体積を計算

[問題 1] 前回、ブロックUIプログラミングツールで作成したピラミッドの体積を求めましょう。

前回は以下のようにピラミッドを作成しました。

[答え 1] 以下のようにブロックUIプログラミングツールでブロックを組みました。

赤く囲んだ部分が新しく追加したブロックです。

このピラミッドは直方体を積み重ねていってます。
直方体の体積は「底面の面積 x 高さ」となるので、この直方体の体積を加算していった合計が答えになります。
ループ前に変数「S」を作成し、0をセットしました。
ループ内で、直方体を作成した後に「S = S + (A x A x dH)」の計算を行っています。
「A x A x dH」が直方体の体積となります。
最後にループの外でメッセージウィンドウに体積を表示しました。

実行するとピラミッドの形状が生成され、メッセージウィンドウに「体積 : 308000」と表示されました。

この体積が正しいか確認します。
Shade3D Professional ver.18以降の「測定」の体積計算機能を使います。
ブラウザで作成されたポリゴンメッシュをすべて選択し、コントロールバーの「測定」より「体積」を選択します。

測定情報ウィンドウの「全選択形状」で308000と表示されました。

これで、ブロックUIプログラミングツールでの計算と測定機能での体積計算が一致するのを確認できました。

ブロックUIプログラミングツールでテキストを扱う

ピラミッドの体積をメッセージウィンドウに表示する際に「テキストの作成」ブロックを使っていました。
これは、ツールボックスの「テキスト」で選択できるブロックです。

テキスト(文字列)はプログラミングで数値と同じようによく使われます。
「テキストの作成」はブロックで指定した2つのテキストを足し合わせる指定になります。
以下の場合「住所:」と「東京都」というテキストをつなげています。

結果は「住所:東京都」となります。
また、数値を指定することもできます。

は、1行のテキスト指定になります。
は、複数行のテキスト指定になります。Enterキーを押すと次の行を入力できます。

ブロックUIプログラミングツールでの整数と小数の扱い

ブロックUIプログラミングツールやShade3Dでは、数値として「整数」と「小数」を指定できます。
ブロックUIプログラミングツールでは、小数点が付いた数値は小数値として扱われます。
また、計算で整数だけが使われる場合はすべて整数として計算されます。
足し算/引き算/かけ算は問題ないのですが、割り算する場合は注意が必要です。

「6 ÷ 8」の計算は、整数で行うと「0 余り 2」となります。
ブロックUIプログラミングツールで以下のようにブロックを組んだ場合、実行するとメッセージウィンドウに0と出力されます。

以下のように「6.00001 ÷ 8」の計算を行うと、「0.750000125」と小数で返されました。

以下のように小数が含まれる計算を行うと、結果は小数で計算されます。

実行すると0.75と出力されました。

ピラミッドのプログラムを小数で扱えるようにする

では、ピラミッドを作るプログラムでより細かい分割を行えるようにしてみます。
変数hCountで分割数を指定しています。
hCount=100とするとdHの計算は整数で行われることになり、「dH = H ÷ hCount = 80 ÷ 100 = 0」となってしまい正しくピラミッドを作ることができません。

これを実行すると、メッセージウィンドウには以下のように表示されます。


test-script: Traceback (most recent call last):
  File "<string>", line 16, in <module>
Exception: 予期せぬエラーが発生しました

プログラムで正しく処理が行われない場合、「エラー」が表示されます。
これを元に修正していくことになります。
このプログラムの場合は、高さ0の直方体を作ろうとしたためエラーが起きました。

そこでブロックを以下のように構成しました。

変数Aと変数Hを整数から小数にするために、0.1を足して0.1を引くためのブロックを入れます。
実行すると以下のようになりました。
高さ方向の分割数(変数hCount)は100を指定しています。

四角推の体積の公式

高さ方向の分割数(変数hCount)を100としたときの体積を計算すると、270679.9016となりました。
四角推の体積を計算する公式は「底面の面積 x 高さ ÷ 3」になります。
ピラミッドを作成するプログラムでは、変数A(100を指定)に底面の一辺の長さ、高さをH(80を指定)としているため、
公式に当てはめて体積を計算すると「底面の面積 x 高さ ÷ 3 = A x A x H ÷ 3 = 100 x 100 x 80 ÷ 3 = 266666.666」となります。

ピラミッドの分割数hCountを500とより大きくして実行し、体積を計算すると267467.0411となります。
hCount=2000として実行すると、体積は266869.7155となりました。
より細かく分割していくと、公式で計算した値に近づくのを確認できます。

プログラミングでの分岐

ブロックUIプログラミングツールで「ループ」は説明しましたので、今度は「分岐」について説明していきます。
この「ループ」と「分岐」はプログラミングでは非常によく使われます。

簡単な例として、変数Aの値が5よりも小さい場合は球を作成、それ以外の場合は直方体を作成するプログラムは以下のようになります。

分岐は、「もし(指定の条件)のときは(指定の処理)を実行する」という構文になります。
ブロックUIプログラミングツールでは、ツールボックスの「ロジック」の「もし」のブロックを使って分岐を行います。

「もし」の下のブロックが「条件」になります。
この「条件」は「もし」ブロックの右上につなげます。

「条件」は「=」「≠」「<」「≦」「>」「≧」のいずれかを指定できます。
これらは「不等号」と呼ばれます。2つの値の比較として使用されます。

「条件」での「不等号」の役割

※ 「不等号」は中学校の数学の範囲になります。

以下は「=」(イコール)を指定しています。
これは、「Aが5と等しい場合」という条件になります。

以下は「≠」(ノットイコール)を指定しています。
これは、「Aが5と等しくない場合」という条件になります。

以下は「<」(小なり)を指定しています。
これは、「Aが5より小さい場合」という条件になります。Aが5の場合は条件に入りません。

以下は「≦」(小なりイコール)を指定しています。
これは、「Aが5と等しいか小さい場合」という条件になります。

以下は「>」(大なり)を指定しています。
これは、「Aが5より大きい場合」という条件になります。Aが5の場合は条件に入りません。

以下は「≧」(大なりイコール)を指定しています。
これは、「Aが5と等しいか大きい場合」という条件になります。

「もし」の構文

分岐の「もし」は、指定の条件に当てはまる場合は指定の処理を実行します。
条件に当てはまらない場合に別途処理を行うことができます。
「もし」のブロックの左上の歯車のアイコンをクリックすると、ポップアップが表示されます。
「そうでなければ」のブロックを右の白い部分にドラッグ&ドロップします。
こうすることで、条件に当てはまらない場合の処理を行う構文となります。

このように分岐は、「条件」「条件に合う場合に実行する処理」「条件に合わない場合に実行する処理」を構文として指定することができます。
これだけではどのように利用すればよいのか実感がわかないため、形状を配置して確認していきます。

形状を敷き詰める

直方体を敷き詰め、その上に均等の間隔で球を配置していきます。

[問題 2] 以下のように、直方体を16 x 16個分敷き詰めましょう。
100(mm) x 100(mm)間隔で直方体を配置しXZ軸方向に5(mm)の隙間を空けるものとします。
直方体の1つのサイズは、縦95(mm)、横95(mm)、高さ100(mm)とします。

[答え 2] 以下のようにブロックUIプログラミングツールでプログラムしました。

ループは二重になります。
変数AはX軸方向のブロック数、変数BはZ軸方向のブロック数としました。
変数XPに直方体の中心位置のX値(これはループで増加させる)、
変数YPに直方体の中心位置のZ値(これはループで増加させる)、を入れています。

内側のループでは、XPが0、100、200、300、400と100ずつ増加します。

外側のループでは、YPが0、100、200、300、400と100ずつ増加します。
この二重ループにより、
(XP, YP)は(0, 0)、(100, 0)、(200, 0)、(300, 0)、、、、(1500, 0)、と変化した後、
(0, 100)、(100, 100)、(200, 100)、(300, 100)、、、、(1500, 100)、となります。
(0, 1500)、(100, 1500)、(200, 1500)、(300, 1500)、、、、(1500, 1500)、まで繰り返されます。
この(XP, YP)を直方体の位置(X, Z)として使用することで、等間隔で直方体が配置されることになります。
1つの直方体のサイズは問いの通りに、縦95(mm)、横95(mm)、高さ100(mm)を指定しました。

[問題 3] 直方体の上に、2個分の間隔を空けて半径50(mm)の球を配置しましょう。
以下のように配置します。

[答え 3] 以下のようにブロックUIプログラミングツールでプログラムしました。
赤く囲った部分を新しく追加しました。

また、変数としてC、C2、C3、D、D2、D3を作成しました。

「C = XP ÷ 300」の計算は整数値になります。
「C2 = XP ÷ 300.0001」の計算は小数を入れたため小数値になります。
「C3 = C2 – C」はXPを300で割ったときの小数点以下の値が入ることになります。
XPが0の場合は、
C3 = (0 ÷ 300.0001) – (0 ÷ 300) = 0 – 0 = 0となります。
XPが100の場合は、
C3 = (100 ÷ 300.0001) – (100 ÷ 300) = 0.3333 – 0 = 0.3333となります。
XPが300の場合は、
C3 = (300 ÷ 300.0001) – (300 ÷ 300) = 0.9999 – 1 = -0.0001となります。
XPが400の場合は、
C3 = (400 ÷ 300.0001) – (400 ÷ 300) = 1.3333 – 1 = 0.3333となります。

これにより、XPが0、300、600、900などの300の倍数の場合に、C3には0に限りなく近い小数値が入ることになります。
同様に、YPが0、300、600、900などの300の倍数の場合に、D3には0に限りなく近い小数値が入ることになります。
分岐の構文では「C3 < 0.01」でかつ「D3 < 0.01」のとき、XPとYPが300で割り切れる位置ごとに球が配置されることになります。

300ごとに間隔を空けることで、その間は直方体のブロック2個分を空けた状態で球が配置されます。

なお、ツールボックスの「ロジック」から、分岐で複数条件を入れることができるブロックを選択できます。

今回はここまでです。
ブロックUIプログラミングツールの中級編の最後は、ループと分岐を使ったプログラミングらしい課題となりました。
不等号の使用は中学校の数学からの知識になるのですが、プログラミングでは必須になるため今回の分岐の条件として説明するようにしました。

次回は別テーマに入る予定です。
間が空きますが、上級編では中学校の数学の範囲(平方根や三角関数など)に加えて、
プログラミングではより高度な形状の作成、
3DCGとしての材質や光源を加えた説明、スクリプト言語についての説明を行う予定です。

カテゴリー: ブロックUIプログラミングツール