NO_WAIT

主にプログラミング

BeetleBlocksでMenger Spongeを作る

BeetleBlocksというScratch風のビジュアルプログラミング言語があります。 いわゆるタートルグラフィックスの3D版ですが、 タートル(turtle)はビートル(beetle)と呼ばれ、 生成されるグラフィックは3D形状になる点が特徴です。 Webブラウザで誰でも気軽に使える点も魅力です。

Proceduralなグラフィックデザインと聞いてfractalを連想し、 Menger Spongeの実装にチャレンジしました。

Youtube動画

Menger Sponge Level 3 with BeetleBlocks - YouTube f:id:shinaisan:20170903204313p:plain

製作過程

サイズ1のcubeを置いて1移動という操作を一定回数繰り返せば、断面が正方形の棒ができます。

f:id:shinaisan:20170903204556p:plain f:id:shinaisan:20170903204611p:plain

Y座標をずらしつつ(change absolute y by 1)、repeatをネストすれば容易に板を作れます。

f:id:shinaisan:20170903204735p:plain f:id:shinaisan:20170903204755p:plain

さらに同様のネストにより、大きい立方体ができます。 この作成過程で、ブロックを文法構造を壊さずにドラッグ&ドロップで移動することのできる ビジュアルプログラミングの利点を実感しました。

f:id:shinaisan:20170903204854p:plain f:id:shinaisan:20170903204910p:plain

一捻り加えます。ランダムにcubeの作成をサボると、スポンジ状になります。

f:id:shinaisan:20170903205057p:plain f:id:shinaisan:20170903205112p:plain

Menger sponge作成の準備として、まず上記乱数による条件式をmengerと名付けたPredicate(真偽値を返す関数のようなもの)でラップします。

f:id:shinaisan:20170903205247p:plain

ところでBeetleBlocksには、浮動小数点数の少数部を切り捨てて整数部を得るfloor関数がありません。 後で使うので、これをReporterとして作っておきます。

f:id:shinaisan:20170903205401p:plain

これで下準備は整いました。 まずはレベル1のMenger spongeを作っていきます。 先のmenger Predicateのインターフェースを下表のように定めます。

入力 期待する値
x, y, z Beetleの座標
iterations Menger spongeのレベル
x1 スポンジのX座標における始点(inclusive)
x2 スポンジのX座標における終点(exclusive)
y1 スポンジのY座標における始点(inclusive)
y2 スポンジのY座標における終点(exclusive)
z1 スポンジのZ座標における始点(inclusive)
z2 スポンジのZ座標における終点(exclusive)
Output Condition
true 与えられた座標がスポンジの一部である(穴でない)
false 穴の場合

スポンジの穴は2つ以上の座標が三等分点の間にある場合にできます。

f:id:shinaisan:20170903210404p:plain f:id:shinaisan:20170903210417p:plain

最後にmenger Predicateを再帰関数へ書き直します。 再帰停止条件iterations (level)が0である場合です。 レベル-0のMenger spongeは単なる立方体ですので、単にtruereportすれば良いでしょう。

f:id:shinaisan:20170903210609p:plain

それより高いレベルの場合、レベルを一つ下げて(iterations - 1)再帰呼び出しします。 その際、「子」となるスポンジの占める領域((x1, y1, z1) to (x2, y2, z2))を再計算します。

f:id:shinaisan:20170903210815p:plain

出来上がり!

f:id:shinaisan:20170903204313p:plain

参考