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()
manderbrot集合flashi实现相关推荐
- do还是doing imagine加to_中学必背英语短语集合:54个doing动名词的固定搭配
中学必背英语短语集合:54个doing动名词的固定搭配mp.weixin.qq.com doing动名词是中小学英语教学中的重要内容.在小学的时候老师大概会把doing解释为一般进行时,但层级越往上 ...
- Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)
zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...
- Redis 笔记(06)— set 类型(向集合添加元素、获取集合元素个数、判断集合中是否包含某个元素、删除给定元素、返回集合中所有元素、计算集合的交集、并集、差集)
Redis 的 set 集合内部的键值对是无序的唯一的.它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL .当集合中最后一个元素移除之后,数据结构自动删除,内存被回收. ...
- 【C#】集合_哈希表_字典_泛型_文件
数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...
- java集合中对象某属性比较排序
TreeSet:它可以给Set集合中的元素进行指定方式的排序. 保证元素唯一性的方式:通过比较的结果是否为0. 底层数据结构是:二叉树. 排序的第一种方式: 让元素自身具备比较性.只要让元素实现Com ...
- 程序员应该吃透的集合List
一:先看看集合框架接口图 (图片来源于网络) 从图中可以看到List实现了Collection接口. 二:Collection接口是什么? 在java类库中,Collection接口是集合类的基本接口 ...
- Java集合详解之Map
一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...
- 第一个python程序:定义,列表,元组,集合,求并集交集,键和值,运算符,缩进
''' 来源:天善智能韦玮老师课堂笔记 ''' print("定义") a = 6 # python里无需定义 print("a=",a) a += 1 # + ...
- python 获取集合里面的某一个元素
python 获取集合里面的某一个元素,想想呢集合是不支持所以,切片,相加,相乘操作的, 所以想获取集合里面的某一个元素需要转化下思路,比如把即可转成列表然后在利用索引获取 例如: list_a = ...
最新文章
- php ajax session失效,PHP中解决ajax请求session过期退出登录问题
- CornerNet-Lite测试
- 【Java深入研究】2、JDK 1.8 LinkedList源码解析
- LoadRunner常遇见的问题
- 如何实现单链表交换任意两个元素(不包括头结点)
- 《深入理解 Spring Cloud 与微服务构建》第二章 微服务应该具备的功能
- struts2学习之基础笔记1
- 功夫小子实践开发-资源异步加载及过渡场景的分析和实现
- python 秘钥_python – 使用ssh密钥加密和解密密码
- 本地连接远程access数据库
- 基于vue+springboot餐厅选座点餐系统源码
- tlac100怎么添加ap_如何设置AC功能管理无线AP
- 造轮子,layuiAdmin——基于layui的后台管理模板
- matlab图像处理代码实例,MATLAB图像处理375例-程序代码
- 书法文化类毕业论文文献都有哪些?
- 走近棒球运动·芝加哥小熊队·MLB棒球创造营
- C++ —— (两个经纬度计算距离、方位角)、(经纬度A+距离+方位,计算目标经纬度)、(多个经纬度计算面积)
- 报错 - 使用marked报错 marked__WEBPACK_IMPORTED_MODULE_4___default(...) is not a function
- 花草茶之常用配方及功效说明
- 布雷顿森林体系的前因后果
热门文章
- 关于有道云笔记网页版的网页剪报功能的分析
- OC类和对象-对象和指针
- 点击网页上的手机号码直接拨打电话(针对手机端)
- android navigationbar监听,Android NavigationBar问题处理的方法
- 联华超市构建商业智能系统
- 攻防世界-CTF小白-WEB(新手)
- 七上八下猜数字_集体郊游在大巴车上搞活气氛的互动游戏
- 重启计算机 任务计划,使用任务计划程序在Windows中安排关机或重新启动 | MOS86...
- linux服务器关机后计划任务还能进行,宝塔面板计划任务定时安全重启Linux服务器实例操作...
- TIMEWAIT与CLOSEWAIT