Julia Set
Julia Set
Needs a lot of work on optimizing for speed...
Drag the mouse to change the shape
Arrow keys to move the center
Page Up/Down to Zoom
Shift + Page Up/Down to change number of iterations
Numpad 2 Anti-alias render (also multiplies # of iterations by 10)
Numpad 1 Normal render
Numpad 0 Fast render
+ Make screen larger
- Make Screen smaller
// Julia Set
// Needs a lot of work on optimizing for speed...
// Drag the mouse to change the shape
// Arrow keys to move the center
// Page Up/Down to Zoom
// Shift + Page Up/Down to change number of iterations
// Numpad 2 Anti-alias render (also multiplies # of iterations by 10)
// Numpad 1 Normal render
// Numpad 0 Fast render
// + Make screen larger
// - Make Screen smaller
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
import flash.ui.*;
import flash.utils.*;
import flash.geom.Rectangle;
import flash.display.*;
import flash.events.*;
import flash.display.Stage;
public class JuliaSet extends MovieClip {
private var RenderSize:Number = 2;
public function JuliaSet() {
stage.scaleMode = StageScaleMode.NO_SCALE;
StartGame();
Draw();
}
private var initialized:Boolean = false;
private var keysDown:Object = new Object();
private function isDown(keyCode:uint):Boolean {
return Boolean(keyCode in keysDown);
}
private function keyPressed(event:KeyboardEvent):void {
keysDown[event.keyCode] = true;
}
private function keyReleased(event:KeyboardEvent):void {
if (event.keyCode in keysDown) {
delete keysDown[event.keyCode];
}
}
private function clearKeys(event:Event):void {
keysDown = new Object();
}
private function StartGame():void {
addChild(bm1);
addEventListener(Event.ENTER_FRAME,enterFrameHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseClickEvent);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpEvent);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.DEACTIVATE, clearKeys);
}
private var MouseDown:Boolean=false;
private var MouseDownX:Number=0;
private var MouseDownY:Number=0;
public function onMouseClickEvent(event:MouseEvent) {
MouseDown=true;
MouseDownX=mouseX;
MouseDownY=mouseY;
}
public function onMouseUpEvent(event:MouseEvent) {
MouseDown=false;
}
private var centerX:Number=0;
private var centerY:Number=0;
private var centerZoom:Number=100;
private var Loops:uint=150;
private var timer:uint=0;
private var timer2:uint=0;
private var timer3:uint=0;
private var oldStageW=stage.stageWidth;
private var oldStageH=stage.stageHeight;
private var startStageW=stage.stageWidth;
private var startStageH=stage.stageHeight;
//
private var bmd1:BitmapData=new BitmapData(stage.stageWidth,stage.stageHeight,true,0xFF000000);
private var rect:Rectangle=new Rectangle(0,0,stage.stageWidth,stage.stageHeight);
private var bytes:ByteArray=bmd1.getPixels(rect);
private var color:uint=0xFFFFFF;
private var colorArray:Array=[];
private var bm1:Bitmap=new Bitmap(bmd1);
private var detailswitch:uint=0;
private var currentX:uint=0;
private var currentY:uint=0;
private var C1:Number=0;
private var C2:Number=0;
private function enterFrameHandler(event:Event):void {
if (MouseDown==true) {
timer2=0;
C1 += (MouseDownX-mouseX)/(centerZoom*4);
C2 += (MouseDownY-mouseY)/(centerZoom*4);
MouseDownY=mouseY;
MouseDownX=mouseX;
}
if (isDown(Keyboard.LEFT)) {
if (isDown(Keyboard.SHIFT)) {
centerX-=0.1;
timer2=0;
} else {
centerX-=5;
timer2=0;
}
}
if (isDown(Keyboard.RIGHT)) {
if (isDown(Keyboard.SHIFT)) {
centerX+=0.1;
timer2=0;
} else {
centerX+=5;
timer2=0;
}
}
if (isDown(Keyboard.UP)) {
centerY-=5;
timer2=0;
}
if (isDown(Keyboard.DOWN)) {
centerY+=5;
timer2=0;
}
if (isDown(Keyboard.PAGE_UP)) {
if (isDown(Keyboard.SHIFT)) {
timer2=Math.min(timer2,8);
Loops++;
} else {
timer2=0;
centerZoom*=1.1;
centerX*=1.1;
centerY*=1.1;
}
}
if (isDown(Keyboard.PAGE_DOWN)) {
if (isDown(Keyboard.SHIFT)) {
timer2=Math.min(timer2,8);
Loops--;
} else {
timer2=0;
centerZoom/=1.1;
centerX/=1.1;
centerY/=1.1;
}
}
if (isDown(Keyboard.SPACE)) {
trace(centerX);
trace(centerY);
trace(centerZoom);
}
if (isDown(Keyboard.NUMPAD_0)) {
detailswitch=0;
timer2=0;
}
if (isDown(Keyboard.NUMPAD_1)) {
detailswitch=1;
timer2=0;
}
if (isDown(Keyboard.NUMPAD_2)) {
detailswitch=2;
timer2=0;
}
if(isDown(187)){
for (var X:int=0; X<stage.stageWidth; X+=1) {
for (var Y:int=0; Y<stage.stageHeight; Y+=1) {
color=uint(0<<16|0<<8|0);
bmd1.setPixel(X,Y,color);
}
}
timer2=0;
RenderSize -= 0.2;
//
centerZoom*=1.1;
centerX*=1.1;
centerY*=1.1;
}
if(isDown(189)){
for (var X:int=0; X<stage.stageWidth; X+=1) {
for (var Y:int=0; Y<stage.stageHeight; Y+=1) {
color=uint(0<<16|0<<8|0);
bmd1.setPixel(X,Y,color);
}
}
timer2=0;
RenderSize += 0.2;
//
centerZoom/=1.1;
centerX/=1.1;
centerY/=1.1;
}
Draw();
timer2=Math.min(timer2,8);
}
public function Draw() {
var X:uint=0;
var Y:uint=0;
/*
timer++;
if(timer > 1){
timer2++
if(timer2 > 1){
timer2 = 0
}
timer = 0;
}
*/
//trace(timer+"-"+timer2);
if (oldStageW!==stage.stageWidth||oldStageH!==stage.stageHeight) {
timer2=0;
removeChild(bm1);
bmd1=new BitmapData(stage.stageWidth,stage.stageHeight,true,0xFFFFFFFF);
rect=new Rectangle(0,0,stage.stageWidth/2,stage.stageHeight/2);
bytes=bmd1.getPixels(rect);
bm1=new Bitmap(bmd1);
timer2=0;
addChild(bm1);
bm1.x = (startStageW-stage.stageWidth)/2;
bm1.y = (startStageH-stage.stageHeight)/2;
}
oldStageW=stage.stageWidth;
oldStageH=stage.stageHeight;
if (detailswitch==0) {
if (timer2<18) {
// stage.stageWidth
// stage.stageHeight
for (X=int(stage.stageWidth/2-(stage.stageWidth/2)/RenderSize); X<stage.stageWidth/2+(stage.stageWidth/2)/RenderSize; X+=1) {
for (Y=int(stage.stageHeight/2-(stage.stageHeight/2)/RenderSize); Y<stage.stageHeight/2+(stage.stageHeight/2)/RenderSize; Y+=1) {
if ((X+Y+timer)%4 == 0 || (X == 0|| Y == 0)) {
colorArray = getpixel((X+centerX-stage.stageWidth/2)/centerZoom,(Y+centerY-stage.stageHeight/2)/centerZoom);
color=uint(Number(colorArray[0])<<16|Number(colorArray[1])<<8|Number(colorArray[2]));
}
//color = 0xFF000000+ 0xFFFFFF*getpixel((X+centerX-100)/centerZoom,(Y+centerY-100)/centerZoom);
if ((X+Y+timer) %4 == 0) {
bmd1.setPixel(X, Y, color);
} else {
if (timer2+(timer %2) <4) {
bmd1.setPixel(X, Y, color);
}
}
//timer++;
}
}
}
timer+=1;
timer2++;
} else if (detailswitch == 1) {
timer=0;
if (timer2==0) {
//
for (X=int(stage.stageWidth/2-(stage.stageWidth/2)/RenderSize); X<stage.stageWidth/2+(stage.stageWidth/2)/RenderSize; X+=1) {
for (Y=int(stage.stageHeight/2-(stage.stageHeight/2)/RenderSize); Y<stage.stageHeight/2+(stage.stageHeight/2)/RenderSize; Y+=1) {
colorArray = getpixel((X+centerX-stage.stageWidth/2)/centerZoom,(Y+centerY-stage.stageHeight/2)/centerZoom);
color=uint(Number(colorArray[0])<<16|Number(colorArray[1])<<8|Number(colorArray[2]));
bmd1.setPixel(X, Y, color);
}
}
}
timer2++;
} else {
timer=0;
if (timer2==0) {
currentX=int(stage.stageWidth/2-(stage.stageWidth/2)/RenderSize);
currentY=int(stage.stageHeight/2-(stage.stageHeight/2)/RenderSize);
/*
for (X=0; X<stage.stageWidth; X+=1) {
for (Y=0; Y<stage.stageHeight; Y+=1) {
bmd1.setPixel(X, Y, 0xFF000000);
}
}
*/
}
timer2++;
X=currentX;
Y=currentY;
//
timer3=getTimer();
while (currentX<stage.stageWidth/2+(stage.stageWidth/2)/RenderSize) {
currentY=int(stage.stageHeight/2-(stage.stageHeight/2)/RenderSize);
while (currentY<stage.stageHeight/2+(stage.stageHeight/2)/RenderSize) {
colorArray = getpixel((X+centerX-stage.stageWidth/2)/centerZoom,(Y+centerY-stage.stageHeight/2)/centerZoom);
var colorArray1 = getpixel((X+0.5+centerX-stage.stageWidth/2)/centerZoom,(Y+centerY-stage.stageHeight/2)/centerZoom);
var colorArray2 = getpixel((X-0.5+centerX-stage.stageWidth/2)/centerZoom,(Y+centerY-stage.stageHeight/2)/centerZoom);
var colorArray3 = getpixel((X+centerX-stage.stageWidth/2)/centerZoom,(Y+0.5+centerY-stage.stageHeight/2)/centerZoom);
var colorArray4 = getpixel((X+centerX-stage.stageWidth/2)/centerZoom,(Y-0.5+centerY-stage.stageHeight/2)/centerZoom);
color = uint(Number((colorArray[0]+colorArray1[0]+colorArray2[0]+colorArray3[0]+colorArray4[0])/5) << 16 | Number((colorArray[1]+colorArray1[1]+colorArray2[1]+colorArray3[1]+colorArray4[1])/5) << 8 | Number((colorArray[2]+colorArray1[2]+colorArray2[2]+colorArray3[2]+colorArray4[2])/5));
bmd1.setPixel(X, Y, color);
Y=++currentY;
}
X=++currentX;
if (getTimer()-timer3>60) {
break;
}
}
}
}
public function getpixel(X:Number, Y:Number) {
// Z = C+Z*Z;
//var ai:Number = 0;
var x:Number=0;
var y:Number=0;
var x2:Number=0;
var y2:Number=0;
var g:Number=0;
//var h:uint=64;
var Loops2:uint=0;
var z:uint=0;
var Return:Boolean=false;
//var oldg:Number = 0;
//if ((X+1)*(X+1)+(Y)*(Y) < 0.06 || (X+1.31)*(X+1.31)+(Y)*(Y) < 0.003 || (1.3*X+0.3)*(1.3*X+0.3)+(Y)*(Y) < 0.38) {
//return [0,0,0];
//} else {
//var i:uint = 0;
//while(i<Loops){
if (detailswitch==2) {
Loops2=Loops*10;
} else {
Loops2=Loops;
}
x=X;
y=Y;
//for (var i:uint=0; i<Loops2; i++) {
var i:uint=0;
while (g<=4 && i < Loops2) {
x2=Number(x*x-y*y+C1);
y=Number(2*x*y+C2);
x=Number(x2);
//y=y2;
g=Number(x*x+y*y);
i++;
if (g>=4) {
var n=i+1-Math.log(g)/Math.log(4);
//var brightness = 255-(255/(i+1-Math.log(Math.abs(g))/Math.log(5)));
//brightness = Math.min(brightness,255)
//brightness = Math.max(brightness,0)
//var red:Number = 128+Math.sin(n/5)*128;
//var blue:Number = 128+Math.sin(n/5+Math.PI/3)*128;
//var green:Number = 128+Math.sin(n/5+2*Math.PI/3)*128;
n*=0.05;
var red:Number=128+Math.sin(n+4.5)*128;
var blue:Number=128+Math.sin(n+4.5+Math.PI/2)*128;
var green:Number=128+Math.sin(n+4.5+Math.PI)*128;
//red = Saw(n/16 + (3/3)*2)*255
//blue = Saw(n/16 + (1/3)*2)*255
//green = Saw(n/16 + (2/3)*2)*255
return [red,blue,green];
//return brightness
Return=true;
break;
}
}
// (r << 16 | g << 8 | b);
if (Return==false) {
//var n = Math.pow(g,0.25)+1-Math.log(Math.pow(g,0.25))/Math.log(h);
//var red1:Number = 64+Math.sin(n*10+4.5)*64;
//var blue1:Number = 64+Math.sin(n*10+4.5+Math.PI/2)*64;
//var green1:Number = 64+Math.sin(n*10+4.5+Math.PI)*64;
//return [red1,blue1,green1];
return [0,0,0];
}
}
}
}