開発環境 |
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