专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » 图形天下:几个图形(04) »正文

图形天下:几个图形(04)

来源: 发布时间:星期四, 2008年9月25日 浏览:48次 评论:0
3.漫步在Mandelbrot集



Mandelbrot集是所有分型曲线是最著名的,上图的左半部分即为一个典型的Mandelbrot集。但是我们并不仅仅是画出图形,而且控制光标在该图形上移动,随着光标的移动,我们会发现在图形的右半部分会生成另外一种有趣的图案,而且该图案将随着光标的移动不断变换,这就是有名的Mandelbrot--julia变换。我们通过此例,进一步说明如何利用构造的数学和图形模块,采用分型技术生成复杂美丽的图案。

设计思想:
本例的设计思想和上例一样,都是采用分型技术,数学迭代公式将三维系统动态生成的像素投影到二维屏幕坐标上去。这里需要介绍的是Mandelbrot集和Julia集之间的对应关系。
据说,Mandelbrot集是Julia集的映像 或字典,之所以这样,是因为二者都是用下列公式迭代生成的:
Z(n+1)=Z(n)*Z(n)+C
其中Z和C都是复杂的数字。对应不同的C值,都有唯一的Julia集和Mandelbrot集相对应。
为了说明二者之间的关系,我们让屏幕平面代表C的一个范围,即横坐标对应C的实数部分,纵坐标对应C的虚数部分。程序首先在屏幕的左半部分生成一个Mandelbrot集,然后让用户在该图形的周围移动光标,对应每一个光标位置,即固定的C坐标,利用反转技术在屏幕的右半部分生成对应的Julia集。
程序代码如下:
#include \"stdio.h\" /*包含头文件系统*/
#include \"stdlib.h\"
#include \"dos.h\"
#include \"conio.h\"
#include \"math.h\"
#include \"mem.h\"
#include \"math.inc\" /*包含自定义头文件*/
#include \"graph.inc\"

#define XMin -2.20 /*定义坐标及矩阵参数*/
#define XMax 0.60
#define YMin -1.20
#define YMax 1.20
#define MaxIter 30.0
#define Res 160.0

char source[160];
int srcoff,srcseg;

int Iterate(float cx, float cy) /*Julia集向Mandelbrot集的变换*/
{
int Iters;
float x, y;
float x2, y2;
float temp;

x=cx;
x2=SqrFP(x);
y=cy;
y2=SqrFP(y);
Iters=0;
while((Iters<MaxIter) && (x2+y2<4))
{
temp=cx+x2-y2;
y=cy+2*x*y;
y2=SqrFP(y);
x=temp;
x2=SqrFP(x);
++Iters;
}
return(Iters);
}

void Pix(int x, int y, int col) /*在图上绘制一象素点*/
{
int a;

Plot(x, y, col);
Plot(x, Res-y-1, col);
}

void CalcMSet() /*根据迭代次数决定颜色并绘制象素点*/
{
int ix, iy;
int Iters;
float cx, cy;
float dx, dy;
int L1, L2;

Draw(0, 0, Res-1, 0, 35);
Draw(Res-1, 0, Res-1, Res-1, 35);
Draw(Res-1, Res, 0, Res, 35);
Draw(0, Res, 0, 0, 35);
Draw(Res, 0, 2*Res-1, 0, 35);
Draw(2*Res-1, 0, 2*Res-1, Res-1, 35);
Draw(2*Res-1, Res, Res, Res, 35);
L1=(MaxIter-(MaxIter*2)/3);
L2=(MaxIter-(MaxIter*5)/6);
dx=(XMax-XMin)/(Res-1);
dy=(YMax-YMin)/(Res-1);
for(iy=2; iy<=((Res-1)/2); iy++)
{
cy=YMin+iy*dy;
for(ix=2; ix<=Res-3; ix++)
{
cx=XMin+ix*dx;
Iters=Iterate(cx, cy);
if(Iters==MaxIter)
Pix(ix, iy, 143);
else
{
if(Iters>L1)
Pix(ix, iy, 215);
else
{
if(Iters>L2)
Pix(ix, iy, 35);
}
}
}
}
}

void CalcJSet(float cx, float cy) /*利用反转技术计算Julia集*/
{
int xp, yp;
float dx, dy;
float r;
float Theta;
float x, y;

x=0;
y=0;
do
{
dx=x-cx;
dy=y-cy;
if(dx>0)
Theta=atan(dy/dx)*0.5;
else
{

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: