Henon MapをFlex(ActionScript3.0)で描いてみました。
2,3年前にJava Appletで作ったやつをFlexにコンバート。
アプレットとか懐かしい。。時代のうつろいをしみじみと感じます。
・エノン写像
Hénon はフランス人の天文学者なので、最初の”H” は発音せず「エノン」と発音します。
二次元の非線形写像ってやつですね。
理系の学部だと、1,2年生の時に位相なんちゃらっていう講義がきっとあったと思います。
難しそうに聞こえても、式を見れば分かるようにとても単純なので、
大学のプログラミング演習とかでやったことのある人も多いんじゃないでしょうか。
僕は当時、こういうアート系のプログラムを描くのにハマってた覚えがあります。
xn+1=1-axn2+byn
yn+1=xn
ただ、今回はバリエーションである以下の式に基づいて描画しました。
こっちの方が絵として見たとき綺麗です。
xn+1 = xn cos(a) – (yn – xn2) sin(a)
yn+1 = xn sin(a) + (yn – xn2) cos(a)
プログラム自体も単純です。描画部分を以下に載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//各変数の宣言とか、BitmapDataのlockとかは適宜;; //SIZEの値は500 (500×500pxの範囲で描画) private function drawHenon(bmp:BitmapData, a:Number):void { //aはパラメータ sin_a = Math.sin(Math.PI * a); cos_a = Math.cos(Math.PI * a); for (var j:int = 0; j <= 80; j++) { _x = 2.0 * (Math.random() - 0.5); //初期値を乱数で与える _y = 2.0 * (Math.random() - 0.5); k = Math.floor(256 * (_x * _x + _y * _y)); //色決め for (var i:int = 0; i < 1000; i++) { //写像の繰り返し yxx = _y - _x * _x; tmp = _x * cos_a - yxx * sin_a; _y = _x * sin_a + yxx * cos_a; _x = tmp; if (Math.abs(_x) < 1.6 && Math.abs(_y) < 1.6) { pt.x = Math.floor(SIZE / 3.2 * _x); //ptはPoint型 pt.y = Math.floor(SIZE / 3.2 * _y); bmp.setPixel(pt.x + SIZE/2, pt.y + SIZE/2, changeColor(k)); } } } } private function changeColor(n:int):uint { var r:uint = (n & 0x2f) << 2; var g:uint = (n & 0x1f) << 3 var b:uint = (n & 0xf) << 4; return r << 16 | g << 8 | b; } |
FlashだとEnterFrameっていうやつのおかげで計算処理をフレームで分散できます。
こういうフラクタルとかカオスを描くのにとても向いてますね。
関連記事:
・Apollonian Gasket – Flex(ActionScript3.0)
・Star Julia – Flex(ActionScript3.0)
・Burning Ship Fractal – Flex(ActionScript3.0)
・Fractal Flight – Flex(ActionScript3.0)でマンデルブロ集合
2 Thoughts