マンデルブロー sakm forked:0favorite:0lines:87license : MIT License modified : 2010-04-26 03:17:23 Embed Tweet package { import flash.display.Sprite; import flash.display.BitmapData; import flash.display.Bitmap; import flash.events.Event; import flash.events.MouseEvent; import frocessing.color.ColorHSV; import flash.geom.ColorTransform; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.geom.Matrix; import flash.display.MovieClip; [SWF(width = "465", height = "465", frameRate = "30")] public class Mandelbrot extends Sprite { private static const HEIGHT:Number =450; private static const WIDTH:Number =450; private static const MAX_I:Number =450; private static const MAX_J:Number =450; private var _canvas:BitmapData; private var _minX:Number = -2; private var _maxX:Number = 1; private var _minY:Number = -1.5; private var _maxY:Number = 1.5; public function Mandelbrot() { _canvas =new BitmapData(WIDTH, HEIGHT, false, 0x000000); addChild(new Bitmap(_canvas)); _minX = -2; _maxX = 1; _minY = -1.5; _maxY = 1.5; stage.addEventListener(MouseEvent.CLICK, onEvent); update(undefined); //addEventListener(Event.ENTER_FRAME, update); } private function onEvent(e:Event) : void { var dx:Number = _maxX - _minX; var dy:Number = _maxY - _minY; _minX = dx * stage.mouseX / MAX_I + _minX - dx / 4.; _maxX = _minX + dx / 2.; _minY = dy * stage.mouseY / MAX_J + _minY - dy / 4.; _maxY = _minY + dy / 2.; update(undefined); } private function update(e:Event) : void { _canvas.lock(); var c:ColorHSV = new ColorHSV(); // _canvas.colorTransform(_canvas.rect, new ColorTransform(0.9, 0.99, 0.9)); for (var i:Number = 0; i < MAX_I; i++) { var x:Number = x = (_maxX - _minX) * i / MAX_I + _minX; for (var j:Number = 0; j < MAX_J; j++) { var y:Number = (_maxY - _minY) * j / MAX_J + _minY; c.h = evaluate(x, y); _canvas.setPixel(i, j, c.value); } } var clearTF:TextField = new TextField(); clearTF.text = (3 / (_maxX - _minX)) + "倍\n"; clearTF.textColor = 0x000000; clearTF.autoSize = TextFieldAutoSize.LEFT; _canvas.draw(clearTF, new Matrix(1.3, 0, 0, 1.3, 5, 5)); _canvas.unlock(); } private function evaluate(x:Number, y:Number) : Number { var v:Number = 0; var w:Number = 0; var v2jo:Number = 0; var w2jo:Number = 0; const N_ITER:Number = 255; for (var i:int = 0; i < N_ITER; i++) { w = 2 * v * w + y; v = v2jo - w2jo + x; v2jo = v * v; w2jo = w * w; if (v2jo + w2jo > 4) { return i / N_ITER * 256; } } return 255; } } } Code Fullscreen Preview Fullscreen undefined ColorHSV mouseX mouseY addEventListener value addChild TextFieldAutoSize.LEFT MouseEvent.CLICK Matrix text int Number