ヒルベルト曲線
ヒルベルト曲線1もフラクタル図形の一つで、空間を覆いつくすような「空間充填曲線」という部類になるっぽい.
同じ手順を繰り返すことで模様が出来ていくわけだが、繰り返しとしてはこの記事2が分かりやすく一定の処理を再帰させることで構築が可能.
まず最初に方向を選んだら勝手にOffset分を現在の位置から伸ばすような関数を用意.
上下左右に対応しており、この方向に対して線が伸びていくことになる.
// 方向に沿ってLineを伸ばすだけ
auto OffsetLine = [&](Direction dir)
{
Vec2 temp = currentPos;
switch (dir)
{
case Direction::up:
currentPos.y -= LineOffset; break;
case Direction::right:
currentPos.x += LineOffset; break;
case Direction::down:
currentPos.y += LineOffset; break;
case Direction::left:
currentPos.x -= LineOffset; break;
}
lineList.push_back(Line{ temp, currentPos });
};
dirで命令を投げると、移動を行いその際の軌跡をlineListに蓄積するわけだ.
さて、ここまで考えれば後は命令を投げるだけ.
ヒルベルト曲線は以下の規則に基づいて処理を行う.
なるほど、なんかよくわからないけど上手く再帰してるっぽい.
これはの場合を考えるともう少しわかりやすくなるかもしれない.
基本的にに到達した場合は何もしないということになる.
そのためのときは次のようになる.
これが基本格子というわけになるということだ.
形としてはそれぞれ次のような感じかな?
このようないろんな角度のコの字を再帰させることで模様を作っているわけだ.
これを実際にまで再帰させてみた結果は次のようになる.
うん、いい感じに模様が作れている!