forked from: forked from: forked from: Batman Equation

by makc3d forked from forked from: forked from: Batman Equation (diff: 167)
Flash port from http://i.imgur.com/CNy9J.jpg
♥0 | Line 167 | Modified 2011-07-30 22:47:58 | MIT License
play

ActionScript3 source code

/**
 * Copyright makc3d ( http://wonderfl.net/user/makc3d )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yqCF
 */

// forked from makc3d's forked from: forked from: Batman Equation
// forked from marsspider's forked from: Batman Equation
// forked from Quasimondo's Batman Equation
package {
    import flash.display.*;
    
    //Flash port from http://i.imgur.com/CNy9J.jpg
    
    public class BatmanEquation extends Sprite {
        
        
        public function BatmanEquation() {
            run();
        }
        
        private function run():void
        {
            stage.scaleMode = "noScale";
            stage.align = "TL";
            
            var map:BitmapData = new BitmapData(465,300,true,0 );
            var display:Bitmap = new Bitmap( map, "auto", true );
            addChild( display );    
            display.width = stage.stageWidth;
            display.scaleY = display.scaleX;
            renderBatman( -9, 9, -4.5, 4.5, map );
        }
        private function nz (n:Number):Number {
			var e:Number = 1e-10;
			if (n < e) {
				if (n > 0) return e;
			} else if (n > -e) {
				if (n < 0) return -e;
			}
			return n;
		}
        private function renderBatman( xFrom:Number, xTo:Number, yFrom:Number, yTo:Number, target:BitmapData ):void
        {
            var xStep:Number = (xTo - xFrom ) / target.width;
            var yStep:Number = (yTo - yFrom ) / target.height;
            var px:int = 0;
            var py:int = 0;

            const const1:Number = 3 * Math.sqrt(33) / 7;
            const const2:Number = 6 * Math.sqrt(10);

			var arg:Complex = new Complex;
			var sqrt1:Complex = new Complex;
			var sqrt2:Complex = new Complex;
			var value:Complex = new Complex;
			var component1:Complex = new Complex;
			var component2:Complex = new Complex;
			var component3:Complex = new Complex;
			var component4:Complex = new Complex;
			var component5:Complex = new Complex;
			var component6:Complex = new Complex;

            for ( var y:Number = yFrom; y <= yTo; y+= yStep )
            {
                px = 0;
                for ( var x:Number = xFrom; x <= xTo; x+= xStep )
                {
                    
                    var abs_x:Number = Math.abs(x);
                    
                    arg.x = (Math.abs (abs_x - 3)) / nz (abs_x - 3);
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = (Math.abs (y + const1)) / nz (y + const1);
					arg.sqrtr ().saveTo (sqrt2);

					sqrt1.mulr (Math.pow (x / 7, 2)).add (
					sqrt2.mulr (Math.pow (y / 3, 2))).saveTo (component1);
					component1.x -= 1; // 1

					arg.x = 1 - Math.pow (Math.abs ( abs_x - 2) - 1, 2);
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = Math.abs (x / 2) - ( const1 / 112 )  * (x * x) - 3 - y;
					arg.add (sqrt1).saveTo (component2); // 2

					arg.x = Math.abs ((abs_x - 1) * (abs_x - 0.75)) / nz ((1 - abs_x) * (abs_x - 0.75));
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = - 8 * abs_x - y;
					arg.add (sqrt1.mulr (9)).saveTo (component3); // 3

					arg.x = ((abs_x - 0.75) * (abs_x - 0.5)) / nz ((0.75 - abs_x) * (abs_x - 0.5));
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = 3 * abs_x - y;
					arg.add (sqrt1.mulr (0.75)).saveTo (component4); // 4

					arg.x = Math.abs ((x - 0.5) * (x + 0.5)) / nz ((0.5 - x) * (0.5 + x));
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = -y;
					arg.add (sqrt1.mulr (2.25)).saveTo (component5); // 5;

					arg.x = Math.abs (abs_x - 1) / nz (abs_x - 1);
					arg.sqrtr ().saveTo (sqrt1);

					arg.x = 4 - Math.pow (abs_x - 1, 2);
					arg.sqrtr ().saveTo (sqrt2);

					arg.x = const2 / 7 - y;
					arg.add (sqrt1.mulr (1.5 - 0.5 * abs_x)).sub (sqrt2.mulr (const2 / 14)).saveTo (component6); // 6

					component1.mul (component2).mul (component3).mul (component4).mul (component5).mul (component6).saveTo (value);

                    target.setPixel32 (px, target.height - py,
						0xff000000 +
						//0x10101 * int ( Math.min (255, value.abs ()) )
						((value.x > 0) ? 255 : 0) +
						((value.y > 0) ? 255 * 256 : 0)
					);
                    

                    px++;
                }
                py++;
            }

        }


        
        
    }
}

// from http://wonderfl.net/c/yE9I
class Complex {
	public var x:Number;
	public var y:Number;

	private static var pool:Vector.<Complex> = new Vector.<Complex>;
	private static var index:int = 0;

	private function pick ():Complex {
		if (index == pool.length) {
			pool [index] = new Complex;
		}
		index++;
		return pool [index - 1];
	}

	public function saveTo (result:Complex):void {
		result.x = x;
		result.y = y;
		index = 0;
	}

	public function Complex (x:Number = 0, y:Number = 0) {
		this.x = x;
		this.y = y;
	}

	public function add (b:Complex):Complex {
		var c:Complex = pick ();
		c.x = x + b.x;
		c.y = y + b.y;
		return c;
	}

	public function sub (b:Complex):Complex {
		var c:Complex = pick ();
		c.x = x - b.x;
		c.y = y - b.y;
		return c;
	}

	public function mulr (n:Number):Complex {
		var c:Complex = pick ();
		c.x = x * n;
		c.y = y * n;
		return c;
	}

	public function mul (b:Complex):Complex {
		var c:Complex = pick ();
		c.x = x * b.x - y * b.y;
		c.y = y * b.x + x * b.y;
		return c;
	}

	public function div (b:Complex):Complex {
		var c:Complex = pick ();
		var D:Number = b.x * b.x + b.y * b.y;
		c.x = (x * b.x + y * b.y) / D;
		c.y = (y * b.x - x * b.y) / D;
		return c;
	}

	public function pow (n:uint):Complex {
		var c:Complex = pick (); c.x = 1; c.y = 0;
		for (var i:int = 0; i < n; i++) {
			var _x:Number = x * c.x - y * c.y;
			var _y:Number = y * c.x + x * c.y;
			c.x = _x;
			c.y = _y;
		}
		return c;
	}

	public function sqrtr ():Complex {
		var c:Complex = pick ();
		c.x = (x > 0) ? Math.sqrt (x) : 0;
		c.y = (x < 0) ? Math.sqrt (-x) : 0;
		return c;
	}

	public function toString (p:uint = 4):String {
		return x.toPrecision (p) + " " + ((y > 0) ? "+" : "") + y.toPrecision (p) + "i";
	}

	public function abs ():Number {
		return Math.sqrt (x * x + y * y);
	}
}