メンガーのスポンジの中から見てみたい

フラクタルに魅せられ続けて

はじまりは新聞報道

2004 年 1 月, 「フラクタルな立方体にエネルギを閉じ込める」という新 聞報道があった. 私はその記事をまずネットの新聞サイトで見て, そして帰り の電車で隣の人が読んでいた夕刊で見た. 学術的 (?) には フォトニッ ク・フラクタル というらしい. 大学 1 年のときにフラクタルとい う単語に出会い, コッホ曲線やマンデルブロ集合などを 286 や 386 の PC で 描きまくっていた私は, 一気に「フラクタルな立方体」の虜になってしまった :-)

「フラクタルな立方体」という表現は正しいのだが, その表現から形状を 想起することはできなかった. しかし, 帰りの電車で見た夕刊には模式図が載っ ていたので, それでようやく形状をイメージすることができた. またネットで いろいろ調べてみると, それには「メンガーのスポンジ」という名前が付いて いるのが分かった. 形状は分かった, 描き方のアルゴリズムのアイデアもある. あとは, 描くだけだ.

シェルビンスキーのカーペット - テキスト版

Carpet - text version

メンガーのスポンジを描きたかったのだが, その腕がない. でもフラクタ ル熱は収まらなかったので, 代替品ということで, メンガーのスポンジに似て いるシェルビンスキーの カーペットを描こうと思った. でも, C 言語で libgd を使うっていうのも芸 がないし, 第一 libgd を使う勘を私は失っている (これでも数年前は, マニュ アルを見ながら C + libgd で画像を切ったり貼ったりしていたのだ). という わけで手近なツールをいろいろ考えていたら, 行き当たったのは Ruby. Ruby だったら, まずはテキスト ベースで描いてみようと考えた.

で, 作ったのが下のスクリプト. 中身は, まず 2 次元配列を準備し, 全体 を 9 分割しながら再帰的に描いていくという, 一般的なスクリプト. 引数に 3 の累乗が与えられなかった場合はちょっとカッコ悪い結果になるけど, 第 1 段階としてはいいでしょう

シェルビンスキーのカーペット - 画像版

Carpet - image version

テキストベースで描いてはみたものの, やっぱり画像でも描いてみたい. でも前にも言ったが, C 言語でちまちま描く気にはならない. う〜んと唸って 考えてみた. 簡単に画像を取り扱うツールとしては, Netpbm が有名だ. Netpbm では, 画像を切り出したり, 画像を張り付けたりという処理の 1 つ 1 つに対応したコマンドがあり, それらを組み合わせていくことで目的の処理を 行うことができる. これで, シェルビンスキーのカーペットを描けないか?

Netpbm を使うとなると, プログラムはシェルスクリプトになる. 私のシェ ルスクリプト・プログラミングの腕はそれほどでもないんで, 関数を作って再 帰的に呼び出すのはしんどいな…と思ったんで, 再帰ではなく積み上げ方式で プログラムをすることに. 要は, まず 9 分の 1 のサイズの画像を作り, それ を次のループで 1 段階大きな画像にぺたぺたと張り付けていく. これを繰り 返していけば, いくらでも大きなシェルビンスキー−カーペットを描くことが できる. 私だって, シェルスクリプト中で while くらいは使え るぞ

というわけで作ってみたのが下のスクリプト. Netpbm のどのコマンドを組 み合わせればいいのか結構悩んだが, 最終的にはこんなスクリプトになった. 作り込んでいないのでエラー処理などは全く考えられていない (のは上の Ruby スクリプトも一緒だ) が, ちゃちゃっと描くにはこれでもいいでしょう.

メンガーのスポンジ

Menger's sponge Menger's sponge (inside) Menger's sponge (round, outside) Menger's sponge (round, inside)

そんなこんなでフラクタル熱をだましてきたのだが, やはりメンガーのス ポンジを描きたいという欲望が高まってきた. 3 次元としてまず思い付くのは VRML. VRML には 結構思い入れがあり, Ver.1 も Ver.2 も仕様書を読みながらスクリプトを書 き, ブラウザで表示させて喜んでいた時代もあった. しかし VRML はプラグイ ンを入れないと見ることができず, 未だにアナログ電話線接続な私にはかなり キツイものがある. それにプラグインを入れなきゃ見られないものは, 他の人 に見てもらえない可能性が大きい.

そこで, POV-Ray に白羽の矢を立 てた. 幸い, 数年前に買った本 (「POV-Ray ではじめるレイトレーシング」 (改訂二版), 小室日出樹, アスキー出版局) もあったし, これでやってみようかと.

POV-Ray で描くにあたって, 難点が 1 つあった. それは, 避けて通れない ループをどう記述すれば良いのかが分からなかったこと. 本には, 参考例程度 に「こんなこともできますよ」というスタンスで #while#end が紹介されていたが, それだけ では情報は不十分. ネットを検索すると, #macro で関数的な表 現をすることができるということがわかったが, 実際にスクリプトをどう描く か, いまいちよくわからない.

でも根本的には, 再帰の部分を手で全て描けば, やれないことはない. そ れにスクリプトで再帰させたところで 4, 5 回も再帰するのがマシンの能力や 画像の解像度的には限界だろう. ということで, 本を見ながらスクリプトを書 き始めた.

まず, #while#macro も使わないスクリプ トが, 数時間の後に完成 (^^)v 続いて, #while は使わなかっ たが #macro を使ったものが完成. そして遂に, #while#macro を使ったものが完成した. 洗 練されたスクリプトではないだろうけど, まぁやればできるものです. POV-Ray を開発してくれた人に感謝. 下に, 最終バージョンを置いておきます.

最後に

結果的に POV-Ray で #while#macro を使 えるようになった (と言い切っていいか?) ので, 今後も細々と立体的なフラクタル を描いていこうかと思ってます. 面白いアイデアを思い付けるか?



[うさぎ印] おたより, お待ちしています

sato.mshr@gmail.com