Illustratorでジェネラティブアートを作ってみる4

最終更新日

ヒルベルト曲線

ヒルベルト曲線は、数学者David Hilbertが1891年に発表した空間充填曲線の一種です。これは1次元の線を2次元(またはそれ以上の次元)の空間に敷き詰める方法を示す曲線で、自己交差せずに徐々に細かく空間を埋めていくフラクタルの一種です。また、単位正方形内を隙間なく埋め尽くすという特性を利用して2D平面を巡回するパスとしても利用されます。

特徴

再帰的構造
ヒルベルト曲線は、基本的なコの字型のパターンを再帰的に細分化することで構成されます。
反復回数(階数)が増えるほど、より細かく領域を埋め尽くします。

フラクタル次元
トポロジー的には1次元の曲線ですが、極限では平面全体を埋め尽くすためフラクタル次元は2に近づきます。

今回はこのヒルベルト曲線をIllustratorに描かせてみます。
まず大きな正方形のエリアを定義します。このエリアを充填する大雑把な曲線は以下のようなコの字がたになります。

充填しているように見えませんか? ではもう一段細分化してみましょう。
先のエリアを2×2に分割します。そして、それぞれのエリアを先程のようにコの字型の曲線で充填しつつ、それらを接続していきます。

まだまだ荒いですがなんとなく先が読めてきましたね?
次の段も、先程分割したエリアを個々に分割して同様に処理すると…

このようになりました。
前段の性質を次段が継承している状態が見えてきましたね。このままパターンとして使えそうです。
これを更に深く設定して実行すると…

このようにヒルベルト曲線は一筆書きで単位平面を埋め尽くします。
以下が7段のコードです。

var depth = 7;
var size = 500;
var doc = app.activeDocument;
var layer = doc.layers.add();
layer.name = "Hilbert Curve";
var pth = layer.pathItems.add();
pth.stroked = true;
pth.strokeWidth = 1;
pth.filled = false;
var points = [];

drawHilbert(depth, 0, 0, size, 1, 0, 0, 1);
     

for (var i = 0; i < points.length; i++) 
{
  var pt = pth.pathPoints.add();
  pt.anchor = points[i];
  pt.leftDirection = pt.anchor;
  pt.rightDirection = pt.anchor;
}

function drawHilbert(d, x, y, size, xi, xj, yi, yj) 
{
  if (d <= 0) 
  {
    var px = x + (xi + yi) * size / 2;
    var py = y + (xj + yj) * size / 2;
    points.push([px, -py]);
    return;
  }
  drawHilbert(d - 1, x, y, size / 2, yi, yj, xi, xj);
  drawHilbert(d - 1, x + xi * size / 2, y + xj * size / 2, size / 2, xi, xj, yi, yj);
  drawHilbert(d - 1, x + xi * size / 2 + yi * size / 2, y + xj * size / 2 + yj * size / 2, size / 2, xi, xj, yi, yj);
  drawHilbert(d - 1, x + xi * size / 2 + yi * size, y + xj * size / 2 + yj * size, size / 2, -yi, -yj, -xi, -xj);
}

このスクリプトでも子を計算するのは再帰処理です。再帰処理は最終的な子が実行完了するまで関数実行が保持されます。このコードでは1段あたり4回の関数コールが含まれますのでピーク時には4000個分近くの関数がメモリ上に留め置かれることになります。再帰処理がメモリを消費するのは関数呼び出しが子要素で行われるため、親が開放されない事に起因します。同じIFS系であってもバーンズリーのシダのようにループ上で確率的に写像を選択していくような構成のプログラムではメモリプレッシャーは低くなります。

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする