前段时间参加blueidea比赛的时候做的一个小东西,没什么创意,下面是代码
*
* 基于逃逸时间算法实现的mardebrot集合的缩放
created bebee qq176767677
*
**
*/
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
//定义初始窗口
var xmin:Number=-2.025;
var xmax:Number=0.6;
var ymin:Number=-1.125;
var ymax:Number=1.125;
//最大迭代次数
var iterations:int=128;
//默认窗口大小
var defaultWidth:Number=400;
var defaultHeight:Number=400;
//定义bitmap
var manderbrot:Bitmap;
//定义bitmapdata
var bmpData:BitmapData;
//鼠标是否按下
var _mouseDown:Boolean=false;
//绘制选择范围的sprite
var sp:Sprite;
//辅助变量,用于计算选择范围
var lastX:Number;
var lastY:Number
function initApp():void
{
//定义绘制图形的bitmapData对象
bmpData=new BitmapData(defaultWidth,defaultHeight,false,0xff00ff)
//定义bitmap对象
manderbrot=new Bitmap(bmpData);
//添加到显示列表
this.addChild(manderbrot);
//定义并添加一个sprite来设置背景颜色
var sp1:Sprite=new Sprite();
sp1.graphics.beginFill(0xff0000,0);
sp1.graphics.drawRect(0,0,defaultWidth,defaultHeight);
sp1.graphics.endFill();
this.addChild(sp1);
sp=new Sprite();
addChild(sp);
//setChildIndex(color,numChildren-1);
setChildIndex(info,numChildren-1);
//注册监视器监听鼠标事件
this.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown)
this.addEventListener(MouseEvent.MOUSE_UP,mouseUp)
this.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove)
this.addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel)
//绘制manderbrot集合
drawManderbrot(defaultWidth,defaultHeight);
}
/* 绘制manderbrot集合
w,h,为窗口的宽和高
*
*/
function drawManderbrot(w:int,h:int)
{var radioX:Number=(xmax-xmin)/w;//绘制窗口和初始窗口的x比率
var radioY:Number=(ymax-ymin)/h;//绘制窗口和初始窗口的y比率
//临时变量,用于计算颜色值
var th:Number=0;
var tb:Number=0
var c:int=0;
//循环迭代窗口中的每一点
for(var i:int=0;i<w;i++)
for(var j:int=0;j<h;j++)
{
var a:Number=xmin+i*radioX;//计算实部
var b:Number=ymin+j*radioY;//计算虚部
//if(!escapesToInfinity(a,b))
th=getescapecolor(a,b);//计算逃逸速度
tb=1-th*th
c=HSBtoRGB(th,1,tb);//映射逃逸速度为一整数颜色值
bmpData.setPixel(i,j,c)//用计算出的颜色值绘制该点
}
}
function escapesToInfinity(a:Number,b:Number):Boolean
{
var x:Number=0;
var y:Number=0;
var iteration:int=0;
do
{
var xnew:Number=x*x-y*y+a;
var ynew:Number=2*x*y+b;
x=xnew;
y=ynew;
iteration++;
if(iteration==iterations)return false
}
while(x<=2&&y<=2);
return true;
}
/*
计算逃逸速度 最大为1
a,b为复数的实部和虚部
*/
function getescapecolor(a:Number,b:Number):Number
{
var x:Number=0;
var y:Number=0;
var iteration:int=0;//迭代次数
var r:Number=0;//半径
while((iteration<iterations)&&(r<4.0))
{
var xnew:Number=x*x-y*y+a;
var ynew:Number=2*x*y+b;
x=xnew;
y=ynew;
r=xnew*xnew+ynew*ynew;//到原点距离的平方
iteration++;//跌代次数加一
}
return iteration/iterations;
}
//鼠标按下,设置选取的起始位置,并记录它
function mouseDown(e:MouseEvent):void
{
_mouseDown=true;
sp.x=mouseX;
sp.y=mouseY;
lastX=mouseX;
lastY=mouseY;
}
//鼠标滚轮的时候改变最大迭代次数
function onMouseWheel(e:MouseEvent):void
{
iterations+=e.delta;
drawManderbrot(defaultWidth,defaultHeight)
}
//鼠标放开,计算新的窗口
function mouseUp(e:MouseEvent):void
{
_mouseDown=false;
var radioX=(xmax-xmin)/width;
var radioY=(ymax-ymin)/height;
var w:Number=mouseX-lastX;
var h:Number=mouseY-lastY;
if(w==0||h==0)return
xmin=xmin+lastX*radioX
ymin=ymin+lastY*radioY
xmax=xmin+w*radioX;
ymax=ymin+h*radioY;
drawManderbrot(defaultWidth,defaultHeight);
sp.graphics.clear();
}
//鼠标按下,并且移动的时候绘制选区
function mouseMove(e:MouseEvent):void
{
if(_mouseDown)
{ sp.graphics.clear();
sp.graphics.lineStyle(1,0xffffff,1);
sp.graphics.drawRect(0,0,mouseX-sp.x,mouseY-sp.y);
}
}
//color.addEventListener(ColorPickerEvent.CHANGE,colorChange)
/*function colorChange(e:ColorPickerEvent):void
{
xmin=-2.025;
xmax=0.6;
ymin=-1.125;
ymax=1.125;
colors=color.selectedColor;
drawManderbrot(400,400)
}*/
/*
hsb颜色转化为rgb颜色 算法参考了java类库的源代码
*/
function HSBtoRGB(hue:Number,saturation:Number,brightness:Number):int
{
var r:int=0,g:int=0,b:int=0;
if(saturation==0){
r=g=b=int(brightness*255+0.5)
}else {
var h:Number=(hue-Math.floor(hue))*6;
var f:Number=h-Math.floor(h);
var p:Number=brightness*(1-saturation);
var q:Number=brightness*(1-saturation*f);
var t:Number=brightness*(1-saturation*(1-f));
switch(int(h)){
case 0:
r=int(brightness*255+0.5)
g=int(t*255+0.5);
b=int(p*255+0.5);
break;
case 1:
r=int(q*255+0.5);
g=int(brightness*255+0.5)
b=int(p*255+0.5);
break;
case 2:
r=int(p*255+0.5);
g=int(brightness*255+0.5)
b=int(t*255+0.5);
break;
case 3:
r=int(p*255+0.5);
g=int(q*255+0.5)
b=int(brightness*255+0.5);
break;
case 4:
r=int(t*255+0.5);
g=int(p*255+0.5)
b=int(brightness*255+0.5);
break;
case 5:
r=int(brightness*255+0.5);
g=int(p*255+0.5)
b=int(q*255+0.5);
break;
}
}
return 0xff00000|(r<<16)|(g<<8)|b
}
initApp()