分形程序高级技巧入门教程--第五到八章
housisong@gmail.com
摘要:
本系列文章是写给分形编程爱好者的一个入门教程;文章章节包括(规划中的,可能增删):
一.复数迭代的mandelbrot集合; 二.颜色平滑的简单周期算法; 三.迭代逃逸次数插值的颜色平滑;
四.使用sin函数做颜色平滑; 五.一个更有效的迭代逃逸次数插值公式; 六.使用误差扩散来杜绝色差感;
七.集合内部的颜色; 八.julia集合; 九.迭代生成的复数值的插值;
十.迭代生成的复数值的高阶插值; 十一.图形的放大和旋转; 十二.复数初始值的变换;
十三.固定颜色表; 十四.设计图案的映射; 十五.纹理映射; 十六.并行计算;
十七.更多的迭代方程和颜色方案; 十八.高次mandelbrot集合; 十九.其他分形的介绍、分形动画
正文:
(5-8章完整项目源代码: http://cid-10fa89dec380323f.office.live.com/self.aspx/.Public/hssFractal5%5E_8.zip )
(我的其他分形相关文章: http://blog.csdn.net/housisong/category/382024.aspx )
五.一个更有效的迭代逃逸次数插值公式
我自己推导了一下迭代逃逸次数插值公式,根据逃逸阈值M,当前迭代次数i,逃逸值Zn和上一个没有逃逸的值Zo的关系,
得到了一个插值公式: i-(f(|Zn|)-f(|M|))/(f(|Zn|)-f(|Zo|)) ; (该公式的适应性很强,可以用在很多不同的地方);
这里,f(x)函数取log(abs(log(x))),并且当M值较大时(多迭代几次),就可以得到接近线性的插值效果;
可以证明,该公式在M足够大的情况下可以约简为第三章介绍的插值公式(特例);当然f(x)函数也可以取其他很多函数,
也可以得到平滑的插值结果,但可能插值的结果看起来不够线性(也许你就想要这个效果);
新的插值公式函数代码如下:
生成的图片如下:
新的插值效果平滑更好一些,但这种情况下可能不容易看出来,当M值较小的时候(M=4),可以对比一下两者的差异:
代码:
M=4,用第三章的插值公式,误差能够直接看出来了:
M=4,新的插值公式(还保持着平滑,但不够线性):
六.使用误差扩散来杜绝色差感
可以看到很多分形图像的颜色过渡非常的流畅亮丽,这是很多分形图像引人入胜的重要因素;
我们的显示器每个颜色分量有256级亮度,大部分情况下眼睛已经很难看出颜色梯度; 但在某些
特殊情况下,生成的图像还是可能会产生肉眼可见的色差;而程序内部实际上可以生成更精确的
颜色,只是在转化到整数颜色时丢失了,这时我们可以利用误差扩散来处理转化过程;
(误差扩散的原理可以参看我的相关3篇文章: <图形图像处理-之-误差扩散 上 中 下 >
http://blog.csdn.net/housisong/archive/2008/04/23/2316924.aspx )
为了简单,我用的最简单的*1扩散模板,代码如下:
生成的图片如下:
(很多人眼睛可能看不出差异,但这一幅的颜色过度更好,我也很难随手构造出一幅特殊情况的图像让大家能直接看出差异)
七.集合内部的颜色
前面我们给集合外的区域利用迭代逃逸次数赋予了比较丰富的颜色,集合内部只是简单的设置为红色;其实集合内部也是可以发挥想象
力赋予漂亮的颜色的,比如根据迭代最后的复数值来生成颜色: (任何迭代过程中生成的数据都可以作为颜色函数的参数)
生成的图片如下:
八.julia集合
复数函数 f(z)=z^2+zM, 其中zM(jx0,jy0)为常量,对平面上的一点z0进行迭代,经足够多次迭代
后函数值不扩散,这类z0点组成的集合为Julia集,对每一个特定的zM值都构成一个相应的Julia集;
可以证明:mandelbrot集是使Julia集为连通的参数(zM)的集合。
把复数方程改写为对应的实数方程:
x(i+1)=x(i)*x(i)-y(i)*y(i)+jx0; //实部
y(i+1)=x(i)*y(i)*2+jy0; //虚部
julia迭代函数: (和 mandelbrot 迭代函数对比一下 )
融合前几章的内容,实际代码如下:
调用该函数生成一幅图片,代码如下: (尺寸640x480,中心点(0,0),r=1.6;最大迭代次数1000)
生成的图片如下:
(Julia集 zM=(-0.74543,0.11301) )
(Julia集 zM=(0.28888,0.012325) )
(Julia集 zM=(-0.81442,0.19633) )
ps:文章没有过多的关注例子图片是否好看(而偏向于达到该目的一些手段和技巧),都用了统一的着色方案,实际
上 生成好看的分形图像 才是本系列文章的真正重点,这也是编写分形程序的最重要的动力!
要生成好看的分形图像,我觉得要点在于图形和颜色;图形(也就是构图和形状)还稍好办一些,而赋予合适的颜
色 更有挑战性!有时候也需要一些运气成分;
比如,我对第3副Julia集图片的颜色生成函数进行了一些调整(后面的文章会涉及一些),得到了一幅新的图片: