ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】L Systemで空間充填曲線などを描く(Hilbert,Peano,Dragon,Levy,Gosper)

成果物

Peano曲線がL-Systemを使って描けることが分かったので、調べてみると非常に多くの空間充填曲線があることが分かったので実装してみました。今回は、線に色を付けることで、描画方法の特徴がわかるようにしました。単位正方形全体を含む曲線を空間充填曲線というようなのですが、今回は、隙間なく並んでいる曲線なども含めて紹介していきます。
空間充填曲線 - Wikipedia

Hilbert Curve

www.youtube.com
Blenderレンダリングでも使われている、有名な空間充填曲線です。

Peano Curve

www.youtube.com
Hilbertが使われることが多いですが、Peano曲線も有名な空間充填曲線の一つです。

Triangle Fractal

www.youtube.com
L-Systemで空間を埋める三角形のフラクタルが書けるようです。私が昔作った三角形のフラクタルとは違いますが、こちらも綺麗です。

Dragon Curve

www.youtube.com
複雑な図形ができるですが、実はタイルのように並べることが可能です。

Quadratic Gosper

www.youtube.com
Hilbert曲線などと同じく、正方形になりますが、かなり複雑な形状をしています。

Hexagonal Gosper

www.youtube.com
先ほどの六角形バージョンです、回転するように成長するのが特徴です。

Levy Curve(おまけ)

www.youtube.com
おまけとして、スカスカのフラクタルも紹介しておきます。こちらのフラクタルも色々なところで使われています。

仕組み

L-Systemのルールを以下のように変更すると、空間充填曲線を描くことができます。線の長さは、それぞれ違った調整を行わなければなりません。どんな数で割ればいいのか、generate(x)というように例を示しておきますが、詳しくはソースコードを参照してください。
L-Systemのルールはこちらのサイトを参考にしています。
L-System manual

Hilbert Curve

axiom = X
X -> -YF+XFX+FY-
Y -> +XF-YFY-FX+
angle = 90
generate(1);
generate((1.*2+1)/1);
generate((3.*2+1)/3);

Peano Curve

axiom = X
X -> XFYFX+F+YFXFY-F-XFYFX
Y -> YFXFY-F-XFYFX+F+YFXFY
angle = 90
generate(2);
generate((2*3+2)/2.);
generate((8*3+2)/8.);

Triangle Fractal

axiom = F+F+F
F -> F-F+F
angle = 120
generate(1);
generate(1.7);(不明)

Dragon Curve

axiom = FX
X -> X+YF+
Y -> -FX-Y
angle = 90
generate(1);
generate(1.43);(不明)

Quadratic Gosper

axiom = -YF
X -> XFX-YF-YF+FX+FX-YF-YFFX+YF+FXFXYF-FX+YF+FXFX+YF-FXYF-YF-FX+FX+YFYF-
Y -> +FXFX-YF-YF+FX+FXYF+FX-YFYF-FX-YF+FXYFYF-FX-YFFX+FX+YF-YF-FX+FX+YFY
angle = 90
generate(5);
generate(5);

Hexagonal Gosper

axiom = XF
X -> X+YF++YF-FX--FXFX-YF+
Y -> -FX+YFYF++YF+FX--FX-Y
angle = 60
generate(2.8);
generate(2.8);(不明)

Levy Curve(おまけ)

axiom = F
F -> -F++F-
angle = 45
generate(1.43);
generate(1.43);(不明)

コード

L-System*という名前で追加しています。
github.com