manderbrot集合flashi实现

前段时间参加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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值