|開発環境|Apache [[Flex]] SDK 4.12.1| ||FlashDevelop 4.6.1| |実行環境|Microsoft Windows 8.1 (64bit)| |プロジェクトの種類|ActionScript 3/AS3 Project| |プロジェクト名|FlashMandelbrot| #table_zebra(project, #fff, #eee) [[http://www.maroon.dti.ne.jp/lance/flash/mandelbrot.html]] Main.as #highlight(actionscript){{ 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 #highlight(actionscript){{ 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(); } } } }}