見出し画像

Cinderellaでカオスを描く:関数の反復

 「カオスCGコレクション」川上博著:サイエンス社 の冒頭に「まずはカオスを描いてみよう」として紹介されているものです。掲載されているプログラムは一般の読者が実際に動かせるように,N88BASICでかかれていますが,巻末にはC言語のコードも掲載されています。
 やることは単純で,はじめに初期値として適当な座標$${(x_0,y_0)}$$を選び,
     $${x_1=y_0+0.2x_0+\dfrac{5x_0}{1+x_0^2}}$$
     $${y_1=-x_0}$$
で点$${(x_1,y_1)}$$ をとります。次に,同じ式で$${(x_2,y_2}$$,$${(x_3,y_3}$$・・・ と,繰り返します。
 この式を,引数に座標を与え,変換した座標を返す関数として定義すれば,「関数を反復して得られるカオス」となります。「フラクタル」で出てくる反復関数系と似ています。異なるのは,関数の形が異なるのはもちろんですが,フラクタルでの反復関数系は,関数を適用するごとに生成される点が増え,前の結果は残さないことです。こちらでは,関数を適用してできるのはひとつの点だけで,できた点はすべて残していきます。1万回やれば1万個の点が画面上に打たれます。こうしてどんどん点が増えていくのですが,何らかの方法で点に色をつけていくとそれによって趣の異なる図ができるのが面白いところです。

 点を次々に作って打っていくだけなら,単なる繰り返し処理ですからどんなプログラミング言語でもほんの数行で書けるでしょう。Cinderellaの場合は,CindyScriptで次のコードを書きます。

f(x,y):=[y+0.2*x+5*x/(1+x^2),-x];
Pt=[3,0];
repeat(1000,
    draw(Pt);
    Pt=f(Pt_1,Pt_2);
);

1行目が関数の定義,2行目が初期値,そのあとが1000回の繰り返しで,点を打ったら次の座標を計算することを繰り返します。Python などでしたら,ライブラリのインポートや画面設定などが必要なのでもうすこしコード量は増えることになります。結果の図は次の通り。

画像1

打たれている点の大きさや色(緑)はCinderellaのデフォルト(初期値)です。点の色や大きさを変え,点が増えていく様子をアニメーションにし,ボタンを作って実行を制御できるようにしたのが次のページにあります。

リンク先をクリックすると次の画面になります。

画像2

青い点は初期値の座標 $${(3,0}$$ です。
「START」ボタンをクリックするとアニメーションが始まります。はじめは100分の1秒ごとに100回ずつ回数を増やしますが,CindyScriptの特質(スロットという機能でコードの実行タイミングを変える)により,回数が増えたときに最初から描き直すので動作はだんだん遅くなります。次の図は50000回ほどやったものですが,眺めているとしばらく状態が変わらないかと思うと突然図がかわることがあります。

画像3

これに色をつけるのですが,色の付け方でまた趣が変わります。

色付けのためのボタンが4つ追加されています。はじめはモノクロです。

画像4

Coloring1 は,「カオスCGコレクション」にあるやりかたで,1万点ごとに色を変えています。色はRGBカラーの8色から白と黒を除いた6色です。7万点からは色が戻ります。実際には色相環の赤から始めて6分の1ずつのところを繰り返しています。

画像5

Coloring2 では,点の数を6つに分けて6色に着色します。Coloring1 では,一度打たれた点の色は変わりませんが,こちらでは,色が変わることになります。

画像7

Coloring3 は Coloring2 を126色にしたものです。

画像7

およそ20万点にしたのが次の図です。外側の色が変わっています。内部に点が増えています。

画像8

色を比較するのであれば,STOPボタンで止めた後,着色ボタンを順に押せば同じ回数での色付けになります。
Reset ボタンを押すと回数がリセットされます。
緑の点はドラッグできて,はじめは $${(3,0)}$$ ですが位置を変えることができます。位置によっては回数を増やしても点が増えない(同じ点になる)ことがあります。次の図は$${(2,2)}$$ にした場合です。

画像9

また,今描かれている領域(回数を増やすと広がりますが)の外に持っていくと次のように閉じた曲線になります。

画像10

これも,ほんのわずかな位置の違いで図が変わります。面白いのでいろいろ試してみましょう。

←前節:概観と文献

→次節:鳥の翼

目次に戻る