地図/再帰

入り組み具合を測る — フラクタル次元

「どの縮尺でも似ている」形は、長さや面積では捉えきれない。海岸線は測る物差しを細かくするほど長くなって、ふつうの長さに落ち着かない。

長さの代わりに次元を測る。格子の目を細かくしながら、形が通過するマスの数を数える。マスを細かくしたとき、通過数が何乗で増えるか。その指数が次元になる。直線なら 1、面を塗り潰せば 2。その間の半端な値が出る形がフラクタル。

箱数え次元。マスの一辺を s、形が通過したマス数を N(s) とすると、自己相似な形では N ∝ s^(-D) が成り立つ。両辺の対数を取れば log Nlog(1/s) の一次関数に乗り、その傾きが次元 D。シェルピンスキー三角形なら D = log3 / log2 ≈ 1.585 で、線でも面でもない値になる。海岸線の長さが物差し依存で発散するという問いが、この一本の傾きに畳まれる。

シェルピンスキーの三角形を、三隅への中点写像をくり返すカオスゲームで点群にして溜めておく。この点群に格子をかぶせ、点が一つでも入ったマスを塗り、塗ったマスの数を数える。下は格子の目を 481632 と段々細かくして、通過マスを数え直していく。

buildPoints は中点写像で点群を作り、最初の 20 個を捨てて配列に溜める。countCells は点が落ちたマスに 1 を立て、立った数を合計する。目を細かくすると塗られるマスは増える。ただし面を塗り潰すほどには増えない。隙間が同じ割合で空き続けるので、増え方が より緩い。

増え方を読むには、各格子サイズの (log(1/s), log N) を平面に打つ。自己相似なら点は一直線に乗り、その傾きが次元。下は格子を 248163264 と倍々に細かくして通過マスを数え、log-log 平面に点を打って、最小二乗で直線を当てる。傾きの数値を縦に伸びる棒で示し、12 の目盛りに添える。

fitSlope が六点に最小二乗で直線を当て、その傾きを返す。六点はほぼ一直線に乗り、傾きは 1.585 あたりに落ち着く。三角形の隙間が同じ割合で空き続けるので、面(2)には届かず、線(1)よりは込み入る。verts を一直線上に並べれば傾きは 1 へ、点群を面いっぱいに撒けば 2 へ寄る。

buildPoints の中点写像を別の自己相似な形の点列に取り替えても、同じ countCellsfitSlope でその形の次元が出る。形は反復で立て、その細かさを変えながら測ると、込み入り具合が一本の傾きに畳まれる。