当前位置:首页 > 网络编程 > 软件语言 > C语言 > 几个图形(04)

几个图形(04)

点击次数:45 次 发布日期:2008-12-01 12:51:42 作者:源代码网
源代码网推荐 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)
会员中心
网络编程
本站推荐
网络编程之精华