package net.peternitsch { import flash.display.*; import flash.events.*; import flash.geom.*; public class PerlinNoiseTest { public var canvas:Bitmap; public var perlinMap:Bitmap; public var particleArray:Array = []; public function PerlinNoiseTest() { var perlinData:BitmapData = new BitmapData(400, 400); perlinMap = new Bitmap(perlinData); var canvasData:BitmapData = new BitmapData( 400, 400, false, 0 ); canvas = new Bitmap( canvasData ); addChild( canvas ); addEventListener( Event.ENTER_FRAME, handleEnterFrame ); stage.addEventListener( MouseEvent.MOUSE_DOWN, handleDown ); stage.addEventListener( MouseEvent.MOUSE_UP, handleUp ); } public function draw():void { perlinMap.bitmapData.lock(); perlinMap.bitmapData.perlinNoise(400, 400, 4, 1, false, true, 14, true, [new Point(counter, -counter), new Point(counter*.5, counter*.5)]); perlinMap.bitmapData.unlock(); } public var force:Number = 5; public function process():void { canvas.bitmapData.lock(); var fade:Shape = new Shape(); fade.graphics.beginFill(0, .05); fade.graphics.drawRect(0, 0, 400, 400); canvas.bitmapData.draw(fade); for ( var i:Number = 0; i < particleArray.length; i++ ) { var color:uint = perlinMap.bitmapData.getPixel(particleArray[i].x, particleArray[i].y); var percent:Number = color / 0xFFFFFF; var deg:Number = (360 * percent) -90; var dx:Number = (force * Math.cos( -deg * Math.PI / 180)) + particleArray[i].x; var dy:Number = (force * Math.sin( -deg * Math.PI / 180)) + particleArray[i].y; var line:Shape = new Shape(); line.graphics.lineStyle(1, color, .5); line.graphics.lineTo(dx, dy); canvas.bitmapData.draw( line, new Matrix(1, 0, 0, 1, particleArray[i].x, particleArray[i].y) ); particleArray[i].x = dx; particleArray[i].y = dy; } canvas.bitmapData.unlock(); } public var counter:int = 1; public function handleEnterFrame( e:Event ):void { counter = counter + 10; draw(); process(); } public function handleDown( e:MouseEvent ):void { addEventListener( Event.ENTER_FRAME, handlePressed ); } public function handleUp( e:MouseEvent ):void { removeEventListener( Event.ENTER_FRAME, handlePressed ); } public function handlePressed( e:Event ):void { var particle:Point = new Point(stage.mouseX, stage.mouseY); particleArray.push( particle ); } } }