最简单的绘制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.此算法简单,画出的图形也令人满意,可是效率非常低,尤其在收敛集合内的时候,
绘图很慢。不知谁有比较高效的算法?

解决方案 »

  1.   

    主要是三个循环中最讨厌的内层循环,可以考虑用多线程分块处理。我有好几个mandelbrot的程序和源码。不过都是效率上大同小异 。大家可以参看fractal3这个软件,他的算法非常快。而且,他的放缩是动态的,也就是开始时10bit的数据,然后double,然后array 200,可以达到很高的放缩效果。但是array那个速度太慢。我们的实现方法,大方点的一般都采用double,这个精度的极限很快就会达到。还有,他的算法是分块处理,很快。这个算法我正在努力实现。