Real – time mandelbrot rotozoom AS3-mal

Elképesztő, és meg tudja csinálni, mindjárt sírok, utoljára 1993-ban csináltak ilyet, assemblerben, 4K-s demóba, jahaaaj, a történelem ismétli önmagát :)

megnézheted a cuccot itt.

//begin
//
//
package 
{
	//
	//
	//
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.StageScaleMode;
	import flash.utils.*;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	//
	//
	//
	public class MandelbrotSet extends Sprite
	{
		//
		//
		//
		private var mbCNT:Bitmap;
		private var mbBMP:BitmapData;
		private var moveTimer:Timer;
		//
		private var maxCycles:int = 32; // meddig pörgesünk egy adott pontot
		private var planeRot:Number = 0;
		//
		private var XCENTER:Number = -1.5;
		private var YCENTER:Number = 0;
		//
		private var LEFT:Number = -2; // a komplex számsík valós minimuma
		private var RIGHT:Number = 1; // a komplex számsík valós maximuma
		private var TOP:Number = 1; // a komlex számsík imaginárius maximuma
		private var BOTTOM:Number = -1; // a komplex számsík imaginárius minimuma
		//
		private var WTH:int = 200; // a rajzterünk szélessége
		private var HTH:int = 200; // a rajztér magassága
		//
		private var XSTEPPING:Number; // a valós rész lépésköze
		private var YSTEPPING:Number; // az imaginárius rész lépésköze
		//
		private var zr:Number; //a változó valós változónk
		private var zi:Number; // a változó imaginárius változónk
		private var cr:Number; // a fix pontunk valós része
		private var ci:Number; // a fix pontunk imaginárius része
		private var zrsq:Number; //zr négyzete
		private var zisq:Number; //zi négyzete
		//
		//
		//
		public function MandelbrotSet( )
		{
			//
			stage.scaleMode = StageScaleMode.NO_SCALE;
			//
			mbBMP = new BitmapData( WTH , HTH , false , 0x110000 );
			mbCNT = new Bitmap( mbBMP );
			addChild( mbCNT );
			//
			moveTimer = new Timer( 10 );
			moveTimer.addEventListener( TimerEvent.TIMER , zoom );
			moveTimer.start( );
			//
		}
		//
		//
		//
		private function zoom ( eventOBJ:TimerEvent ):void
		{
			//
			LEFT += ( XCENTER - LEFT )/32;
			RIGHT += ( XCENTER - RIGHT )/32;
			BOTTOM += ( YCENTER - BOTTOM )/32;
			TOP += ( YCENTER - TOP )/32;
			//
			XSTEPPING = ( RIGHT - LEFT ) / WTH; // a valós rész lépésköze
			YSTEPPING = ( TOP - BOTTOM ) / HTH; // az imaginárius rész lépésköze
			//
			planeRot += Math.PI/32;
			//
			for ( var a:int = 0 ; a < WTH ; ++a )
				for ( var b:int = 0 ; b < HTH ; ++b )
					calcPoint( a , b );
			//
		}
		//
		//
		//
		private function calcPoint( xp:int , yp:int ):void
		{
			//
			var length:Number = Math.sqrt( xp*xp + yp*yp );
			var angle:Number = Math.atan2( yp , xp ) + planeRot;
			var newPos:Point = Point.polar( length , angle );
			//
			zr = 0; //a komplex számnunk valós része
			zi = 0; //a komplex számunk imaginárius része
			cr = LEFT + XSTEPPING * newPos.x; //az aktuálisan vizsgált pontunk valós része
			ci = BOTTOM + YSTEPPING * newPos.y; //az aktuálisan vizsgált pontunk imaginárius része
			//
			zrsq = zr*zr;
			zisq = zi*zi;
			//
			for ( var a:int = 0 ; a < maxCycles ; ++a )
			{
				//
				zi = zr * zi * 2 + ci;
				zr = zrsq - zisq + cr;
				//
				zrsq = zr * zr;
				zisq = zi * zi;
				//
				if ( zrsq + zisq > 4 ) //  a végtelenbe tart
				{
					//
					var color:int = a*4 << 16 | ( a*4 + 50 ) << 8 | a*4 ;
					mbBMP.setPixel( xp , yp , color );
					return;
					//
				}
				//
			}
			//
			mbBMP.setPixel( xp , yp , 0x000000 );
			//
		}
		//
		//
		//
	}
	//
	//
	//
}
//
//
//end

A cikkhez kapcsolódó hozzászólásokat a fórum "Actionscript 3" topicjában várjuk.

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét