あけましておめでとうございます。NUMです。
2024年になって絶賛genuary2024が開催中ですね!
genuaryとは1月から1日ごとにお題が変わっていくジェネラティブアートのお祭りみたいなものです。
僕は毎日お題をやるのは難しいので、やりたいお題だけを選んでやってます!
今回の記事はDay8のお題「Chaotic system.」で作ったグモウスキー・ミラの写像について
実装方法を書いていこうと思います。
概要
グモウスキー・ミラの写像とはグモウスキーさんとミラさんが発見した非線形の2次元離散力学系の一例です。
離散力学系とは、n番目の状態がその手前の n−1 番目の状態によって一意に決まる法則が与えられた系です。(非線形とはグラフが直線ではなく曲線のような形です。)
簡単に言えば発散も収束もしない非線形なグラフみたいなイメージだと思います。
以下は神話の鳥というグモウスキー・ミラの写像の中でも有名な形の一つです。
美しすぎます、、これが数式から生成されるとは恐ろしいですね。
数式
まあ、難しいことは置いといて以下の数式をプログラムに落とし込むことで面白い形が出来上がります。
この数式を観察すると3つの構造に分解できそうですね。
式を分解してみると結構単純なのに、複雑な形ができるのがなんとも面白い。
1. n+1番目のX座標を解く式(定数:α,σ,μ)
2. n+1番目のY座標を解く式
3. 1と2に共通する式
この式は関数にして1と2から呼び出してあげればスマートに実装できそう。
これで数式の理解ができました。この数式をプログラム化していきましょう。
プログラム
プログラムは至ってシンプルでグモウスキー・ミラの写像の計算に従い、for文で微小な点をプロットしていくだけです。
//神話の鳥
float a = 0.009;
float σ = 0.05;
float μ = -0.801;
//ウイルス
/*
float a = 0.001;
float σ = 0.02;
float μ = 0.2480;
*/
void setup() {
size(850, 850);
background(0);
pixelDensity(displayDensity());
strokeWeight(0.5);
stroke(255, 40);
drawAttracter(width/2-50, height/2, 15, 500000);
}
// アトラクターの描画
void drawAttracter(float posx, float posy, float scl, int time) {
// 初期値
float x = 1;
float y = 1;
// 座標を時間変化させる
for (int i = 0; i<time; i++) {
point(posx + x * scl, posy + y * scl);
float tmpx = x;
x = calcXCoordinate(x, y);
y = calcYCoordinate(tmpx, x);
/*
//ウイルス
μ = random(-0.296, -0.496);
a *= random(0.008, 0.1);
σ -= random(0.02, 0.04);
*/
}
}
// グモウスキー・ミラの写像
// x座標を計算
float calcXCoordinate(float x, float y) {
return y + a * y * (1 - (σ * pow(y, 2))) + calcCommonFunction(x);
}
// y座標を計算
float calcYCoordinate(float xn, float xn1) {
return -xn + calcCommonFunction(xn1);
}
// f1とf2の共通関数
float calcCommonFunction(float x) {
return μ * x + (2 * (1 - μ) * pow(x, 2)) / (1 + pow(x, 2));
}
一つだけ気を付けるべきはY座標の計算です。
Y座標はn番目とn+1番目のX座標を使って計算するため、前回のX座標をtmpxに格納しています。
そしてcalcYCoordinate関数にtmpxとxを引数として計算しています。
// アトラクターの描画
void drawAttracter(float posx, float posy, float scl, int time) {
// 初期値
float x = 1;
float y = 1;
for (int i = 0; i<time; i++) {
point(posx + x scl, posy + y scl);
float tmpx = x;
x = calcXCoordinate(x, y);
y = calcYCoordinate(tmpx, x);
}
}
パラメータによる変化
コメントアウトしてある「ウイルス」のパラメータを使ってみてください。
drawAttracter関数のtimeを3000000くらいに設定するとたまにウイルスみたいな形になります。
さっきまで鳥みたいだった模様がウイルスみたいになりました!
パラメータによってこんなに形が変わるのは驚きですね。
まとめ
今回はストレンジアトラクターの一つ「グモウスキー・ミラの写像」を作ってみました。
実はジェネラティブアートを初めて3年になりますが、カオス理論の作品はこれが初めてで、こんなにもパラメータによって見える顔が違うことに驚きました。
予測不可能性はジェネラティブアートの醍醐味ですが、カオス理論は相性がとても良さそうですね。ただ、数式の制御が難しいので良いパラメータを見つけるのに一苦労でした、、
それでは最後まで読んでいただきありがとうございました!
Commentaires