複数のストレンジアトラクターを合成してみよう
目次
はじめに
今回、複数のストレンジアトラクターを合成する方法を紹介します。
ストレンジアトラクターは収束するパラメータが一定割合あるため、不思議な形を形成するパラメータを探す必要がありました。
複数のストレンジアトラクターを合成すると、収束する確率が低くなるようで、パラメータをランダムに選択しても高い確率で形を形成します。
2つのストレンジアトラクターを組み合わせとすると、片方が収束するパタメータの場合でも、もう一方に引っ張られて何かしら形ができます。
(もちろん収束しなくなるわけではないので、見た目が良いと人の目で判断する部分は変わらないのかもしれません。)
複数のストレンジアトラクターを合成することで、今までみたことのない形を作り出すことができるかもしれません。
de Jong アトラクターとClifford アトラクターの合成
de Jong アトラクターとClifford アトラクターの2つを使って合成する手法を説明していきます。
- de Jong アトラクター
x_n+1 = sin(a*y_n) - cos(b*x_n) y_n+1 = sin(c*x_n) - cos(d*y_n)
- Clifford アトラクター
x_n+1 = sin(a*y_n) + c*cos(a*x_n) y_n+1 = sin(b*x_n) + d*cos(b*y_n)
a, b, c, d
は定数です。ストレンジアトラクターの振る舞いを決めるパラメータ。
2つのストレンジアトラクターを合成する方法は次のようになります。
let I = random([0, 1]); let dx, dy; switch(I){ case 0: //Peter De Jong Attractor dx = sin(a0*y) + cos(b0*x); dy = sin(c0*x) + cos(d0*y); break; case 1: //Clifford Attractor dx = sin(a1*y) + c1*cos(a1*x); dy = sin(b1*x) + d1*cos(b1*y); break; default: break; }
次の位置dx, dy
を計算する際に、計算に用いるストレンジアトラクターをその都度ランダムに選択します。
それぞれのパラメータはa0, b0, c0, d0
とa1, b1, c1, d1
としています。
ここでは全てのパラメータをランダムにしてみます。(定数を使ってもOKです。)
let a0 = PI*random(-1,1); let b0 = PI*random(-1,1); let c0 = PI*random(-1,1); let d0 = PI*random(-1,1); let a1 = PI*random(-1,1); let b1 = PI*random(-1,1); let c1 = PI*random(-1,1); let d1 = PI*random(-1,1);
では、de Jong アトラクターとClifford アトラクターをランダムなパラメータで合成してみます。
パラメータをランダムにしているため、実行する毎に様々な形になります。
時折、2つが分離したような状態が現れます。
これはこれでアリなのかもしれません。
3つのストレンジアトラクターの合成
3つのストレンジアトラクターを合成する場合も難しくありません。
下のように用いるストレンジアトラクターを増やしていけば良いです。
let I = random([0, 1, 2]); let dx, dy; switch(I){ case 0: //Peter De Jong Attractor dx = sin(a0*y) + cos(b0*x); dy = sin(c0*x) + cos(d0*y); break; case 1: //Clifford Attractor dx = sin(a1*y) + c1*cos(a1*x); dy = sin(b1*x) + d1*cos(b1*y); break; case 2: //Jason Rampe 1st Attractor dx = cos(b2*y) + c2*sin(b2*x); dy = cos(a2*x) + d2*sin(a2*y); break; default: break; }
3つでも4つでも5つでも好きなストレンジアトラクターを組み合わせてみると面白いです。
de Jong アトラクター同士の合成
パラメータを別々に用意すればde Jong アトラクター同士を合成することもできます。
let I = random([0, 1, 2]); let dx, dy; switch(I){ case 0: //Peter De Jong Attractor dx = sin(a0*y) + cos(b0*x); dy = sin(c0*x) + cos(d0*y); break; case 1: //Peter De Jong Attractor dx = sin(a1*y) + cos(b1*x); dy = sin(c1*x) + cos(d1*y); break; case 2: //Peter De Jong Attractor dx = sin(a2*y) + cos(b2*x); dy = sin(c2*x) + cos(d2*y); break; default: break; }
おわりに
複数のストレンジアトラクターを合成する方法を紹介しました。
合成することで収束する確率が低くなり、不思議な形が出現しやすくなります。
更にストレンジアトラクターの組み合わせ次第で、無数の形を生み出すことができます。
自分だけの合成ストレンジアトラクターを作って遊んでみてください。