分形程序高级技巧入门教程--第五到八章

                  分形程序高级技巧入门教程--第五到八章
                         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集图片的颜色生成函数进行了一些调整(后面的文章会涉及一些),得到了一幅新的图片:


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值