最简单的绘制Mandelbrot分形图的算法是:在复数平面上的一个矩形区域(left:l,top:t,right:r,bottom:b)内扫描每一个
点(在X轴方向上和Y轴方向上间隔距离offset,如取值0.001)得到复数点c坐标
(cx,cy),代入一个复变函数f(z).(比如f(z)=z^2+c),进行迭代运算,迭代的方式:
初始化 z 为 c ,
算出new_z = f(z),将new_z的值赋值给z,再代入 f(z),c的值不变,如此循环...
这样就得到关于new_z的一个复数数列,判断此数列是否收敛,如果收敛c即属于
Mandelbrot集合,在(cx,cy)所在的点标上颜色color,(如color取黑色).对于收敛的判断有一个简单的方法:
定义两个变量:max_count最大迭代次数,limit发散的边界,count迭代的次数对于每一个c点的值,按上边的方法迭代max_count次,在每一次循环中判断
new_z到原点的距离是否大于limit.如果是,可以认为new_z发散,得到
迭代次数count,根据count的值给c所在的点(cx,cy)标记颜色,然后退出循环.
如果到循环结束仍小于limit,那么可以认为new_z收敛,标记颜色color.此算法简单,画出的图形也令人满意,可是效率非常低,尤其在收敛集合内的时候,
绘图很慢。不知谁有比较高效的算法?
点(在X轴方向上和Y轴方向上间隔距离offset,如取值0.001)得到复数点c坐标
(cx,cy),代入一个复变函数f(z).(比如f(z)=z^2+c),进行迭代运算,迭代的方式:
初始化 z 为 c ,
算出new_z = f(z),将new_z的值赋值给z,再代入 f(z),c的值不变,如此循环...
这样就得到关于new_z的一个复数数列,判断此数列是否收敛,如果收敛c即属于
Mandelbrot集合,在(cx,cy)所在的点标上颜色color,(如color取黑色).对于收敛的判断有一个简单的方法:
定义两个变量:max_count最大迭代次数,limit发散的边界,count迭代的次数对于每一个c点的值,按上边的方法迭代max_count次,在每一次循环中判断
new_z到原点的距离是否大于limit.如果是,可以认为new_z发散,得到
迭代次数count,根据count的值给c所在的点(cx,cy)标记颜色,然后退出循环.
如果到循环结束仍小于limit,那么可以认为new_z收敛,标记颜色color.此算法简单,画出的图形也令人满意,可是效率非常低,尤其在收敛集合内的时候,
绘图很慢。不知谁有比较高效的算法?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货