開発環境 Apache Flex SDK 4.12.1
FlashDevelop 4.6.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 FlashMandelbrot


Main.as
package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
 
    public class Main extends Sprite 
    {
        private var bitmapData:BitmapData = new BitmapData(800, 600, false);
        private var bitmap:Bitmap = new Bitmap(bitmapData);
        private var offsetX:Number = 0;
        private var offsetY:Number = 0;
        private var zoom:Number = 4;
 
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            stage.addChild(bitmap);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            onRender();
        }
 
        private function onRender():void 
        {
            const palette:Array = [0xffffff, 0xffff00, 0xff00ff, 0x00ffff];
            const maxIterate:int = 700;
 
            bitmapData.lock();
            for (var y:int = 0; y < bitmapData.height; y++) 
            {
                var v:Number = 1 - y / bitmapData.height;
                var cy:Number = (v - 0.5) * (bitmapData.height / bitmapData.width) * zoom + offsetY;
                for (var x:int = 0; x < bitmapData.width; x++) 
                {
                    var u:Number = x / bitmapData.width;
                    var cx:Number = (u - 0.5) * zoom + offsetX;
 
                    var px:Number = 0;
                    var py:Number = 0;
                    var n:int;
                    for (n = 0; n < maxIterate; n++)
                    {
                        var px2:Number = px * px;
                        var py2:Number = py * py;
                        if (4 <= px2 + py2) break;
                        py = 2 * px * py + cy;
                        px = px2 - py2 + cx;
                    }
 
                    var color:uint = (n == maxIterate) ? 0x000000 : palette[n % 4];
                    bitmapData.setPixel(x, y, color);
                }
            }
            bitmapData.unlock();
        }
 
        private function onKeyDown(e:KeyboardEvent):void 
        {
            const dzoom:Number = 2;
            const doffset:Number = zoom * 0.15;
            switch (e.keyCode) 
            {
                case Keyboard.UP: zoom /= dzoom; break;
                case Keyboard.DOWN: zoom *= dzoom; break;
                case Keyboard.A: offsetX -= doffset; break;
                case Keyboard.W: offsetY += doffset; break;
                case Keyboard.D: offsetX += doffset; break;
                case Keyboard.S: offsetY -= doffset; break;
                default: return;
            }
            onRender();
        }
 
    }
 
}
 

Ver.2
package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
 
    public class Main extends Sprite 
    {
        private var bitmapData:BitmapData = new BitmapData(640, 480, false);
        private var bitmap:Bitmap = new Bitmap(bitmapData);
        private var offsetX:Number = 0;
        private var offsetY:Number = 0;
        private var zoom:Number = 4;
 
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            stage.addChild(bitmap);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            onRender();
        }
 
        private function onRender():void 
        {
            const maxIterate:int = 500;
            const palette:Vector.<uint> = Vector.<uint>([0x00ffff, 0xff00ff, 0xffff00, 0xffffff]);
            const zoomY:Number = bitmapData.height / bitmapData.width * zoom;
            var inputVector:Vector.<uint> = new Vector.<uint>(bitmapData.width * bitmapData.height);
 
            var i:int = 0;
            for (var y:int = 0; y < bitmapData.height; y++) 
            {
                var cy:Number = (0.5 - y / bitmapData.height) * zoomY + offsetY;
                for (var x:int = 0; x < bitmapData.width; x++) 
                {
                    var cx:Number = (x / bitmapData.width - 0.5) * zoom + offsetX;
 
                    var px:Number = cx;
                    var py:Number = cy;
                    var color:uint = 0x0000ff;
                    for (var n:int = 0; n < maxIterate; n++)
                    {
                        var px2:Number = px * px;
                        var py2:Number = py * py;
                        if (4 <= px2 + py2)
                        {
                            color = palette[n % 4];
                            break;
                        }
                        py = 2 * px * py + cy;
                        px = px2 - py2 + cx;
                    }
                    inputVector[i++] = color;
                }
            }
            bitmapData.setVector(bitmapData.rect, inputVector);
        }
 
        private function onKeyDown(e:KeyboardEvent):void 
        {
            const dzoom:Number = 2;
            const doffset:Number = zoom * 0.15;
            switch (e.keyCode) 
            {
                case Keyboard.UP: zoom /= dzoom; break;
                case Keyboard.DOWN: zoom *= dzoom; break;
                case Keyboard.A: offsetX -= doffset; break;
                case Keyboard.W: offsetY += doffset; break;
                case Keyboard.D: offsetX += doffset; break;
                case Keyboard.S: offsetY -= doffset; break;
                default: return;
            }
            onRender();
        }
 
    }
 
}
 
最終更新:2014年06月19日 09:47