注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简单代码

寻找代码的灵魂

 
 
 

日志

 
 
关于我

对于本博客内所有原创文章和代码的引用必须标明“来源:http://simplesource.blog.163.com/”。如需应用于商业目的必须经本人同意,本人对所有原创文章和代码保留一切权利。 PS:需要部分程序源代码的请留下邮箱地址

网易考拉推荐

绚丽的Julia集以及VC渲染程序(附源代码)  

2007-09-14 20:54:47|  分类: 我的程序 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

一、Julia集简介

法国数学家Gaston Julia发现了在数论中有名的Julia集, Julia集绚丽多姿,变幻莫测,是数学与美学的完美结合。

Julia集描述如下:在复平面上,水平的轴线代表实数,垂直的轴线代表虚数。每个Julia集合(有无限多个点)都决定一个常数C,它是一个复数。现在您在复平面上任意取一个点,其值是复数Z。将其代入下面方程中进行反复迭代运算:

Zn+1=Zn × Zn + C 

就是说,用旧的Z自乘再加上C后的结果作为新的Z。再把新的Z作为旧的Z,重复运算。 当你不停地做,你将最后得到的Z值有3种可能性:

1、Z值没有界限增加(趋向无穷)

2、Z值衰减(趋向于零)

3、Z值是变化的,即非1或非2

趋向无穷和趋向于零的点叫定常吸引子,很多点在定常吸引子处结束,被定常吸引子所吸引。   非趋向无穷和趋向于零的点是"Julia集合"部分,也叫混沌吸引子。

问题是我们怎样才能让计算机知道哪一个点是定常吸引子还是"Julia集合"。

一般按下述算法近似计算:

n=0;

while ((n++ < Nmax) && (( Real(Z)2 + Imag(Z)2) < Rmax))

{

Z = Z × Z + C;

}

其中:Nmax为最大迭代次数,Rmax为逃离界限

退出while循环有两种情况,第一种情况是:

(Real(Z)^2 + Imag(Z)^2) >= Rmax

属于这种情况的点相当于"1、Z值没有界限增加(趋向无穷)",为定常吸引子,我们把这些区域着成白色。第二种情况是:

n >= Nmax

属于这种情况的点相当于"2、Z 值衰减(趋向于零)"或"3、Z 值是变化的",我们把这些区域着成黑色。黑色区域图形的边界处即为"Julia集合"。"Julia集合"有着极其复杂的形态和精细的结构。

 

二、Julia集渲染程序

自从在网上偶然发现了Julia集,我就被Julia集的魅力深深吸引住了,于是我赶紧花了两天时间完成了这个简陋的程序,通过程序我们可以对Julia集有更深刻的了解。

先上几个由本程序渲染的图:

 绚丽的Julia集以及VC渲染程序(附源代码) - 简单代码 - 简单代码绚丽的Julia集以及VC渲染程序(附源代码) - 简单代码 - 简单代码绚丽的Julia集以及VC渲染程序(附源代码) - 简单代码 - 简单代码绚丽的Julia集以及VC渲染程序(附源代码) - 简单代码 - 简单代码

程序运行时的界面:

绚丽的Julia集以及VC渲染程序(附源代码) - 简单代码 - 简单代码

与网上其他程序不同,本程序引入了调色板概念,调色板是一个高度为1的图像文件,程序渲染Julia集的时候会从指定的调色板文件里面获取颜色,这样您就可以随意调整Julia集的颜色搭配,渲染出个性的Julia集图像。

程序利用空闲时间细化图像,在运行效率和图像精度中间找到了一个平衡。增加了使用的舒适度。

本程序适用于混沌分形教学研究以及艺术创作等领域。

其他操作说明:

左右键修改实常数值

上下键修改虚常数值

按下Ctrl精细修改

Ctrl+s保存图像到程序相同目录下

按下鼠标左键拖动图像

用鼠标滚轮缩放图像

按下a减小修改精细度

按下z增加修改精细度

按下i初始化缩放、拖动和修改参数

Ctrl+n重新导入配置文件

 

三、程序关键代码

 

// 绘制Julia集

void CJulia::Paint(

    CDC * pDC, CRect rect, double dx0, double dy0, double drate,

    double cr, double ci, int nMin, int nMax, int colorN, double rMax)

{

  if(m_iColorNum <= 0)

  {

    return;

  }

  double x0, x, y0, y;

  double xx, yy;

  int n;

  double cx, cy;

  cx = rect.Width() * drate;

  cy = rect.Height() * drate;

  CPoint center = rect.CenterPoint();

  // 生成颜色

  COLORREF * colors = new COLORREF[nMax - nMin + 1];

  for(n = nMin; n <= nMax; n++)

  {

    colors[n - nMin] = m_colors[m_iColorNum * (n % colorN) / colorN];

  }

 

  for(x0 = rect.left; x0 < rect.right; x0++)

  {

    for(y0 = rect.top; y0 < rect.bottom; y0++)

    {

      x = (x0 - dx0) / cx;

      y = (y0 - dy0) / cy;

      for(n = nMin; n < nMax; n++)

      {

        xx = x * x;

        yy = y * y;

        if(xx + yy > rMax)

        {

          break;

        }

        y = x * y * 2;

        x = xx - yy;

        x += cr;

        y += ci;

      }

      pDC->SetPixel(int(x0), int(y0), colors[n - nMin]);//n < nMax ? RGB(255, 255, 255): RGB(0, 0, 0));

    }

  }

  // 撤销颜色

  delete [] colors;

}

 

  评论这张
 
阅读(2896)| 评论(10)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018