分形程序高级技巧入门教程--第一到四章

                          分形程序高级技巧入门教程--第一到四章
                                  housisong@gmail.com

摘要:
    本系列文章是写给分形编程爱好者的一个入门教程;文章章节包括(规划中的,可能增删):
    一.复数迭代的mandelbrot集合; 二.颜色平滑的简单周期算法; 三.迭代逃逸次数插值的颜色平滑;
    四.使用sin函数做颜色平滑; 五.一个更有效的迭代逃逸次数插值公式; 六.使用误差扩散来杜绝色差感;
    七.集合内部的颜色; 八.julia集合; 九.迭代生成的复数值的插值;
    十.迭代生成的复数值的高阶插值; 十一.图形的放大和旋转; 十二.复数初始值的变换;
    十三.固定颜色表; 十四.设计图案的映射; 十五.纹理映射; 十六.并行计算;
    十七.更多的迭代方程和颜色方案; 十八.高次mandelbrot集合; 十九.其他分形的介绍、分形动画

正文:

   (1-4章完整项目源代码: http://cid-10fa89dec380323f.office.live.com/self.aspx/.Public/hssFractal1%5E_4.zip )
   (我的其他分形相关文章: http://blog.csdn.net/housisong/category/382024.aspx )




一.复数迭代的mandelbrot集合

对于复数函数 f(z)=z^2+z0; 给定任意的z0,迭代可以得到序列:z0^2 + z0,
z0^4 + 2*z0^3 + z0^2 + z0,...... 我们把经过任意次迭代以后而不发散的z0定义为
Mandelbrot集合; 把复数方程改写为对应的实数方程:
    x(i+1)=x(i)*x(i)-y(i)*y(i)+x(0);  //实部
    y(i+1)=x(i)*y(i)*2+y(0);          //虚部

Mandelbrot迭代函数:我们认为迭代一定次数max_iter以后,没有逃逸的点就属于集合,返回max_iter;
如果发生逃逸,返回当前迭代次数,代码如下:  (当|Z(i)|^2>=4时,点必然逃逸)

 

迭代逃逸次数映射成颜色值:我们根据不同的逃逸次数,简单生成一个对应的RGB颜色值,代码如下:

 

我们把复平面上以点(x0,y0)为中心横轴2*r宽的复数区域均匀采样with(宽)*height(高)个点,
获取其Mandelbrot迭代逃逸次数,并映射成相应的颜色填充到一个with(宽)*height(高)的图片中,代码如下:


调用该函数生成一幅图片,代码如下: (尺寸640x480,中心点(-0.5,0),r=2;最大迭代次数1000)

 

生成的图片如下:


二.颜色平滑的简单周期算法
  直接的%求余容易造成较强的颜色阶梯,我们用一个平滑一点的函数来处理迭代值到颜色的转化:
color=(i%510)-255;   当i连续变化的时候,得到的color值也是连续变化的: (其他代码相同)

生成的图片如下:


对于相邻的逃逸次数,现在的颜色还不够平滑,可以把那些*乘法系数取消掉,这样就能保证得到
的颜色的平滑(但颜色的对比就比较小了):

生成的图片如下:


三.迭代逃逸次数插值的颜色平滑
   相邻点的逃逸次数差为1,对应到颜色最大亮度的1/255时才能看起来平滑(如:coloring1_s);
如果想增大他们之间的颜色对比,又有可能产生颜色梯度(如:coloring1); 我们如何同时满足
这两个要求呢?答案是对逃逸次数进行插值! 
 
逃逸次数 插值公式: i +1-log(log(|Z|))/log(P); (P为复数方程的指数,这里为2)
  这是一个近似插值公式,有一定的误差;如果多迭代几次的话,可以减小该公式的误差;
  (公式来源参见: http://linas.org/art-gallery/escape/ray.html )
代码如下: (增加了迭代次数)

 

生成的图片如下:


四.使用sin函数做颜色平滑
  sin函数也是个不错的颜色平滑调节函数,函数值连续,处处可导...
产生的颜色更柔和一些,代码如下:

 
生成的图片如下:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值