forked from: マンデルブロ高速化のやる気のない高速化

by uwi forked from マンデルブロ高速化 (diff: 25)
♥0 | Line 69 | Modified 2009-08-18 17:35:41 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yTJK
 */

// forked from toyoshim's マンデルブロ高速化
// forked from toyoshim's マンデルブロ @ Frocessing
package {
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
    import frocessing.color.ColorHSV;
    import net.hires.debug.Stats;

    [SWF(width="465", height="465", frameRate="30", backgroundColor="0x00000000")]
    public class Mandelbrot extends Sprite {
        private var bmp:Bitmap;
        private var img:BitmapData;
        private var txt:TextField;
        
        private var offset_x:Number = 0.0;
        private var offset_y:Number = 0.0;
        private var zoom:Number = 1.0;

        private var _hsvs : Array;

        public function Mandelbrot() {
            // width x height, no transparent, ARGB=0x00000000
            img = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0);
            bmp = new Bitmap(img);
            stage.addChild(bmp);
            
            _hsvs = new Array(37);
            for(var i : int = 0;i <= 36;i++){
                var n : int = 360 - i * 10;
                _hsvs[i] = new ColorHSV(n, n, n).value;
            }
            
            // draw initial image
            draw();
            
            // add mouse event listener
            stage.addEventListener(MouseEvent.CLICK, onClick);

            // add debug status window
            stage.addChild(new Stats());
        }

        public function onClick(event:MouseEvent):void {
            offset_x = (offset_x + stage.mouseX - img.width / 2.0)
                        / zoom;
            offset_y = (offset_y + stage.mouseY - img.height / 2.0)
                        / zoom;
            zoom *= 1.2;
            offset_x *= zoom;
            offset_y *= zoom;
            draw();
        }
        
        private var _imgwzoom : Number;
        private var _imghzoom : Number;
        
        private function calcDepth(x:int, y:int):int {
            var cx:Number = (x + offset_x - img.width * 2.2 / 3.0)
                        / _imgwzoom;
            var cy:Number = (y + offset_y - img.height / 2.0)
                        / _imghzoom;
            var r:Number = 0.0;
            var i:Number = 0.0;
            var n:int;
            for (n = 0; n <= 36 && r * r + i * i <= 4; n++) {
                var nr:Number = r * r - i * i + cx;
                var ni:Number = 2.0 * r * i + cy;
                r = nr;
                i = ni;
            }
            return n;
        }
        
        private function draw():void {
            _imgwzoom = (img.width / 2.0) * zoom;
            _imghzoom = (img.height / 2.0) * zoom;
            img.lock();
            for (var y:int = 0; y < img.height; y++) {
                for (var x:int = 0; x < img.width; x++) {
                    img.setPixel(x, y, _hsvs[calcDepth(x, y)]);
                }
            }
            img.unlock();
        }
    }
}

Forked