Jeffrey Cross
Jeffrey Cross

コードボックス:処理を伴う再帰の探索

再帰はさまざまな分野に適した重要なプログラミング手法であり、その中でも特に興味深いビジュアルイメージを作成しています。簡単に言うと、再帰は、問題を解決するのが簡単になるまで(これを「基本ケース」と呼びます)、複雑な問題をそれ自体のより小さく単純なバージョンに分割するための技法です(これを「再帰ステップ」と呼びます)。このコードボックスには、シンプルで幾何学的な概念を使って、この面白くて面白いテクニックを探るのに役立つさまざまなスケッチがあります。

多くの芸術家、特にM.C.で彼らの作品に再帰的なテーマを使っています。エッシャーとルネ・マグリット。この最初のスケッチは、ピートモンドリアンのスタイルでイメージを作成する方法を示しています。

次のプログラムは再帰を使って、偽モンドリアンを作成します。基本的なケースは単純です:あなたがするのは太い黒い境界線で塗りつぶされた長方形を描くことだけです。四角形の色は、少数の原色(赤、白、黄色など)から選択されます。再帰的なステップは、その内部のランダムな点を選択することによって、この長方形(およびそれに続くすべての長方形)を4つの小さい長方形に分割することです。次の図は、それがどのように機能するのかを示しています。

出力は次のようになります。

最後に、これがスケッチです、mondrian.pde:

ピート() 関数はプログラムの中心であり、ほとんどの再帰的プログラムがどのように機能するかを示しています。ここにあります:

//再帰を使ってモンドリアン風の画像を描くvoid piet(int x0、int y0、int x1、int y1、int N){if(N == 0){//基本ケース - 太いカラフルな四角形を描く黒いボーダーint sw = 3。 //これは四角形の境界色の線幅ですc [] = {#ff0000、#00ff00、#0000ff、#ffff00、#ffffff}; //モンドリアンカラーパレットの塗りつぶし(c [int(random(c.length))]); strokeWeight(sw); rect(x0、y0、x1-x0-sw、y1-y0-sw); } else {//再帰的ステップ - 現在の長方形を4つの新しいランダムな長方形に分割するint i = int(random(x0、x1)); int j = int(random(y 0、y 1)); piet(x 0、y 0、i、j、N − 1)。 //左上の長方形piet(i、y0、x1、j、N-1); //右上の長方形piet(x0、j、i、y1、N-1); //左下長方形piet(i、j、x 1、y 1、N-1); //右下の長方形}}

この関数は5つの引数を受け取ります:長方形の左上隅の座標(x0とy0)、右下隅の座標(x1とx2)、そして現在の再帰的な深さ(N)です。この関数は2つの基本的なことをします。最初に、N = 0のときに「基本ケース」に達しているかどうかをテストします。そうであれば、すべての基本的なモンドリアンの色(赤、欲、青、黄)からランダムに色付けされた長方形を描くだけです。 、そして白)。それが基本の場合ではないならば、それは現在の長方形の中のランダムな点(i、j)を選び、そしてそれを呼び出します。 ピート() さらに4回、4つの新しい内部長方形を形成するさまざまな座標を渡します。それ自体を呼び出す機能を持つというこの「分割統治」アプローチは、再帰の特徴です。

単純な再帰プロセスは、自然に見えるオブジェクトを作成するためによく使用されます。たとえば、各「植物」が直線で始まる次の単純な再帰プロセスを使用して、自然に見える植物を作成できます。この線は、元の線と3〜4個の新しい交互の枝からなる新しい「枝」に置き換えられます。 (正確な分岐数は、設定可能な変数によって決まります)。これと同じプロセスが、指定した深さまで、新しいブランチごとに再帰的に適用されます。次の図は基本概念を示しています。

線はベクトルとして表されます。ベクトルは、変数xとyによって定義される原点、変数rによって定義される長さ、および変数thetaによって定義される角度から構成されます。次の図は、これらの変数がどのように関連しているかを示しています。

この図は、この基本プロセスで作成されたいくつかの単純な「植物」を示しています。

これがスケッチです、plant.pde:

最後に、最もよく知られている再帰的な数値の1つであるスノーフレーク曲線を表示せずに、私は思い出させたいと思います。基本ケースは単純な三角形です。各辺は元の線の長さの1/3である4つの線分の新しい集合に置き換えられます。その後、これらの新しいセグメントのそれぞれを新しい4行のセグメントに繰り返し置き換えます(この再帰的な手順)。次の図は、プロセスの基本的な考え方を示しています。

結果は次のようになります。

これがスケッチです、snowflake.pde。再帰的な深さ(通常はNと呼ばれる)を変更して、画像に与える影響を確認するには、controlP5が提供するライブラリを用意する必要があります。 (残念ながら、ライブラリは現在モニタ画面を超えて既知の宇宙の範囲にまで及ぶスライドバーをサポートしていないので、最大再帰深度を無限ではなく6に制限しなければなりませんでした。)

More:Codeboxの全コラムをチェックする

メーカーの小屋で:


Processing入門Processing、コードを使用して図面、アニメーション、インタラクティブグラフィックを作成するための簡単な言語であるProcessingを使用して、コンピュータプログラミングを簡単に学ぶことができます。プログラミングコースは通常理論から始まりますが、この本では創造的で楽しいプロジェクトに飛び込むことができます。基本的なプログラミングを学びたい人には理想的で、プログラミングのスキルがある人のためのグラフィックスの簡単な紹介としても役立ちます。

シェア

コメントを残します