ギンの備忘録

デジタルアートやプログラミングやテクノロジー関連のこと。

複数のストレンジアトラクターを合成してみよう

f:id:gin_graphic:20220309093310p:plain:w400

目次

はじめに

今回、複数のストレンジアトラクターを合成する方法を紹介します。
ストレンジアトラクターは収束するパラメータが一定割合あるため、不思議な形を形成するパラメータを探す必要がありました。
複数のストレンジアトラクターを合成すると、収束する確率が低くなるようで、パラメータをランダムに選択しても高い確率で形を形成します。
2つのストレンジアトラクターを組み合わせとすると、片方が収束するパタメータの場合でも、もう一方に引っ張られて何かしら形ができます。
(もちろん収束しなくなるわけではないので、見た目が良いと人の目で判断する部分は変わらないのかもしれません。)

複数のストレンジアトラクターを合成することで、今までみたことのない形を作り出すことができるかもしれません。

de Jong アトラクターとClifford アトラクターの合成

de Jong アトラクターとClifford アトラクターの2つを使って合成する手法を説明していきます。

x_n+1 = sin(a*y_n) - cos(b*x_n)
y_n+1 = sin(c*x_n) - cos(d*y_n)
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, d0a1, 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 アトラクターをランダムなパラメータで合成してみます。

ソースコード

f:id:gin_graphic:20220309073607p:plain:w400

パラメータをランダムにしているため、実行する毎に様々な形になります。

f:id:gin_graphic:20220309074100p:plain:w400

f:id:gin_graphic:20220309074103p:plain:w400

時折、2つが分離したような状態が現れます。
これはこれでアリなのかもしれません。

f:id:gin_graphic:20220309074139p:plain:w400

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;
        }

ソースコード

f:id:gin_graphic:20220309074957p:plain:w400

f:id:gin_graphic:20220309075002p:plain:w400

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;
        }

ソースコード

f:id:gin_graphic:20220309075434p:plain:w400

f:id:gin_graphic:20220309075449p:plain:w400

おわりに

複数のストレンジアトラクターを合成する方法を紹介しました。
合成することで収束する確率が低くなり、不思議な形が出現しやすくなります。
更にストレンジアトラクターの組み合わせ次第で、無数の形を生み出すことができます。
自分だけの合成ストレンジアトラクターを作って遊んでみてください。