月刊「理系への数学」数学パズルにトドメをさす?! 今月のFlash
第12回
2011年 4月号
同じ形に分割せよ!(その2)〜フラクタルな相似分割三昧〜
相似分割で出現する奇妙な自己相似図形を観察する

目的

正方形や正三角形を,今度は相似な3つの図形に分割します。相似比(1:a:b, 0<a<1, 0<b<1)と,相似な図形の配置・向きを指定することで,必然的に出現する自己相似構造を持つ怪しい図形を,生成過程のアニメーション付きで観察しましょう。

今回は,小さい2つの相似図形の配置は元の図形の頂点の位置に限定していますが,それでも,前回の2分割の場合の,相似の中心となる1点に集約するような単純な自己相似構造と比べ,はるかに複雑な自己相似構造が出現します。構造の詳細を観察できるように,今回はFlashPlayerの右クリックメニューによる画面ズーム機能を有効にしてあります。さらに大画面で観察したい方は,こちらの960×720版をご利用下さい。

操作方法

・右下の「Draw」ボタンをクリックすると,選択された設定で分割された図形が表示されます。

・図形は,自己相似構造を再帰的に描画する際の再帰の深さが順次大きくなるようなアニメーションとして表示されます。表示部(画面左側)の左上隅には,現在表示している図形の再帰の深さと頂点の数を表示しています。

分割タイプの選択

まず,操作部(画面右側)の中程に並んでいる小アイコンをクリックして,カテゴリー(図形の種類と小さい相似図形の配置)を選びます。カテゴリーは,
  0:正方形(対角の位置に配置)
  1:正方形(隣り合う頂点に配置)
  2:正三角形(2頂点に配置)
の3つです。

選択されたカテゴリーについては,さらに下に表示される配置概念図で小さい相似図形の向きを選択します。以下,1:a:bに分割される3つの相似図形を順にX,Y,Zとすると,概念図の外枠がX,赤い小図形がY,青い小図形がZに対応し,3つの相似図形の向きはFの文字で示されています。この概念図上の赤または青の小図形をクリックすると,Y,Zの向きが順次切り替わります。

配置概念図の右下に示す3ケタの分割タイプIDは,左から順にカテゴリー番号・Yの向き,Zの向きを表します。

相似比の設定

相似比の設定には,小アイコンのすぐ上の2段のパネル(ratio1・ratio2)を使用します。2つの数字は,相似比1:a:bのaとbをパーセンテージで表したものとなっており,目盛り部を直接クリックするか,目盛りの左右の小アイコンをクリック(右が増加,左が減少)することで,それぞれ10%から90%の範囲で1%単位で設定できます。(なお,後述するノーチェックモードでは,設定可能範囲は1%〜99%に拡がります。)

打ち切りパラメータの設定

本Flashでは,自己相似図形の詳細化打ち切りのパラメータとして,以下の3つを用意しています。

・最大頂点数(max-points):Xの頂点数がこの値以上となった時点で,詳細化を打ち切ります。

・解像度(resolution):解像度をRとすると,詳細化の過程において,局所的に見て詳細化で用いる部品が元の図形の1/Rスケール未満になる場合は,その箇所についてはそれ以上の詳細化を行わないという制御を行います。

・最大深度(max-depth):詳細化処理の再帰の深さがこの値に到達した時点で,詳細化を打ち切ります。

これらのパラメータは,カラーパレットの下の3段のパネルで設定します。操作方法は相似比の場合と同様,目盛りを直接クリックするか,左右のアイコンで増減させます。デフォルト値は,最大頂点数:20000,解像度:2000,最大深度:100です。最大頂点数と解像度の最適な設定については後述しますが,最大深度は通常の描画では変更する必要はありません。(描画の途中段階の様子を観察したい場合には,最大深度3から順次増やしていくことができます。)

表示色の設定

今回も,描画する相似図形の色を,右上の2つのカラーパレットで希望する色をクリックすることで設定できます。(上がXの色,下がYとZの色です。)

画面のズーム

今回は,FlashPlayerが標準で用意しているFlash全体の拡大/縮小の機能が有効になっているので,拡大すると至る所に同じ形状が現れる自己相似図形の面白さを実感するために活用して下さい。

Flashコンテンツ上で右クリック(Macで右ボタンのないマウスを使用している場合はcontrol+クリック)するとポップアップメニューが出現するので,そこで「拡大」を選択すると,クリックしたポイントを中心として拡大された表示となり,「すべて表示」を選択すると通常の表示に戻ります。拡大は,FlashPlayer側で決まっている限度まで繰り返すことができます。また,拡大表示時には,カーソルが手のひら型になり,画面をドラッグで動かすことができます。

相似比のチェックと「ノーチェックモード」

この相似分割では,0<a<1, 0<b<1でありさえすれば必ず相似比1:a:bに正しく分割できるというわけではありません。例えばカテゴリー0の分割の場合,a+b≧100%とすると,YとZの領域が重なってしまうため,相似分割は成立しません。そこで,このFlashでは,境界線の詳細化の最初の2ステップでYとZの領域が交差する(もしくは接する)ような相似比が設定された場合,不適切な設定であると判断して描画を打ち切るようなチェック機能を設けてあります。正方形(カテゴリー0・1)の場合は必ずa+b≧100%でNG,正三角形(カテゴリー2)の場合はもう少し緩いですが,例えばID=200でa=bとすると,a≧61%でNGとなります。

しかし実際には,最初は領域が重なっていても,詳細化が進み角が取れることで,領域の重複が解消され,最終的には相似分割が成立するケースも存在します(例:ID=131,(a,b)=(75,30))。一方,最初の2ステップでは重複せずにNGと判定されなくても,詳細化が進むにつれ領域が変形して,最終的には重複してしまうケースもあります(例:ID=201,(a,b)=(80,45))。

このように,上記チェック機能はあくまでも目安に過ぎないので,隠しモードとして「ノーチェックモード」を用意しています。表示部左下隅の隠しボタン(カーソルを乗せると赤く変色します)をクリックすることで,通常モードと交互に切り替わり,ノーチェックモードでは表示部右上に「No-check mode」と表示されます。ノーチェックモードでは,相似比のチェックなしに描画されるだけでなく,相似比の設定範囲が1%〜99%に拡がります。

このノーチェックモードをあえて隠しモードにしているのは,不用意に無茶なパラメータでノーチェックで描画すると,境界線が際限なく交差する非常に複雑な描画をFlashが行うことになり,場合によってはPCのパフォーマンスに著しい影響を与える可能性があるからです。例えば,ID=200,(a,b)=(90,90)として,念のために最大頂点数を2000ぐらいに設定してノーチェックモードで描画してみると,何が危険なのか理解できると思います。ノーチェックモードの利用は慎重に行って下さい。

打ち切りパラメータの最適化

このFlashでは,複雑な多角形を描画させるため,PCの性能に応じて最大頂点数を設定して下さい。(筆者のメモリー2GBのMacBookでは,最大頂点数を最大の50000に固定しても,前述のような著しく不適切な相似比に設定しない限り問題なく動作しています。)

ただし,頂点数で打ち切ると,ある深さ以降の詳細化が一律打ち切られることになり,aとbの値が異なる場合は同じ深さでも場所によって詳細化で使用する部品の倍率が異なるため,全体として描画の粗さに大きなバラツキが生じます。なるべく均等に詳細化されたきれいな自己相似図形を描画させるためには,解像度を調整する必要があります。

解像度は単に大きくすればよいわけではなく,最大の5000に設定していても,最大頂点数で打ち切られてしまうと,意味がありません。むしろ,解像度で制約をかけて,不必要な詳細化を抑えることで,最大頂点数の制約の範囲内で最適な描画を行うために用います。最大頂点数は固定した上で,最適な解像度にするには,最大頂点数で打ち切られない範囲での最大の解像度を探せばよいでしょう。

なお,描画終了時に表示部右下に出るメッセージは,
  terminated.(points limit):最大頂点数で打ち切り
  terminated.(depth limit):最大深度で打ち切り
  finished.:最大頂点数にも最大深度にも到達せずに解像度の制約のみで描画終了
となっています。「terminated」と表示された場合は,バランスの悪い描画になっている可能性があります。

パラメータサンプル

ここでは,いくつかの興味深い図形のためのパラメータのサンプルを示します。参考値として最大頂点数を50000とした時の最適な解像度Rの値を付記してあります。また,※印のパラメータの図形は,ノーチェックモードでしか描画できません。

・ID=210, (a,b)=(77,44) (R=750):トップページのサムネイルでも使用した,いかにもフラクタルという感じの図形

・ID=211, (a,b)=(77,44) (R=750):四辺形を交互に取り合うイメージがわかりやすいパターン

・ID=201, (a,b)=(75,45) (R=1000):しいたけ

・ID=200, (a,b)=(75,45) (R=1000):ぜんまい

・ID=200, (a,b)=(90,19) (R=1000):三角渦巻きの行列

※ID=210, (a,b)=(90,23) (R=750):のこぎり

※ID=211, (a,b)=(89,29) (R=500):打ち寄せる波

・ID=002, (a,b)=(85,14) (R=5000):かたつむり

・ID=020, (a,b)=(75,24) (R=5000):全方向ドリル

・ID=022, (a,b)=(75,24) (R=5000):上下ドリル

・ID=100, (a,b)=(55,40) (R=5000):鷲鼻

・ID=101, (a,b)=(54,45) (R=5000):スプリング1

・ID=102, (a,b)=(54,45) (R=5000):スプリング2

・ID=110, (a,b)=(54,45) (R=5000):ノイズ1

・ID=113, (a,b)=(54,45) (R=5000):ノイズ2

・ID=122, (a,b)=(79,20) (R=5000):足指

・ID=130, (a,b)=(89,10) (R=5000):三角の列1

・ID=112, (a,b)=(89,10) (R=5000):三角の列2

・ID=132, (a,b)=(89,10) (R=5000):三角の列3

※ID=103, (a,b)=(75,30) (R=5000):百目鬼

※ID=131, (a,b)=(83,28) (R=2000):竜の頭の列

※ID=133, (a,b)=(90,27) (R=500):豪華な柱の列

以下,本編の図として出現したものです。(図の向きは異なります)

・ID=000, (a,b)=(40,40) (R=5000):図17

・ID=110, (a,b)=(40,40) (R=5000):図18左

・ID=101, (a,b)=(40,40) (R=5000):図18右

・ID=100, (a,b)=(40,40) (R=5000):図19左上

・ID=130, (a,b)=(40,40) (R=5000):図19右上

・ID=103, (a,b)=(40,40) (R=5000):図19左下

・ID=133, (a,b)=(40,40) (R=5000):図19右下

・ID=010, (a,b)=(60,30) (R=5000):図20右

・ID=200, (a,b)=(50,50) (R=5000):図22右

・ID=200, (a,b)=(60,60) (R=1000):図24右

・ID=200, (a,b)=(67,33) (R=5000):図25左上

・ID=211, (a,b)=(67,33) (R=5000):図25右上

・ID=210, (a,b)=(67,33) (R=5000):図25左下

・ID=201, (a,b)=(67,33) (R=5000):図25右下

なお,上記のうちa+b>100%となるようなケースでは,図形の境界線はフラクタルの要件を満たします。(詳しくは来月号(5月号)の本編で解説します)

みなさんも,パラメータを様々に調整して,より面白い(より気持ちの悪い?)図形を探し,拡大機能を使って細部を観察してみて下さい。