分形图制作两例

Author: 周鸣扬 Date: 2001年 43期

?牐犜贐1版中我们谈到了分形在计算机图形中的重要地位,现在就以制作B1版所提到的那两个简单的分形图为例,着手于具体编程应用。在VC中新建一个单文档项目Fractal,在FractalView.cpp中加入下面的代码:
  ?牐?#include “math.h”
  ?牐?//将树枝的切分点定义为黄金分割点
  ?牐?#define CUT_RATE 0.618
  ?牐?//左侧树枝相对于主枝的张开度
  ?牐?#define LEFT_BRANCH_ANGLE 80
  ?牐?//右侧树枝相对于主枝的张开度
  ?牐?#define RIGHT_BRANCH_ANGLE 20
  ?牐?//树的主枝长度
  ?牐?#define BRANCH_LENGTH 300
  ?牐?//最小分支的长度,改变这个值可以控制树叶的浓度
  ?牐?#define LAST_BRANCH_LENGTH 0.1
  ?牐?//树枝上的节点数,改变这个值可以控制树枝的浓度 
  ?牐?#define BRANCH_NUM 40
  ?牐?/*DrawBranch函数的功能:从点(x,y)到点(Lengh*cos(StartAngle*3.14/180),y-Lengh*sin(StartAngle*3.14/180))之间画一条直线
  ?牐燣engh:直线的长度
  ?牐燬tartAngle:直线的倾斜度
  ?牐爌DC:绘直线时使用的设备环境句柄
  ?牐?*/
  ?牐爒oid DrawBranch?煟╥nt x,int y,float Lengh,int StartAngle,CD C*pDC)??
  ?牐爗??
  ?牐爁loat x1,y1,nx,ny,count;??
  ?牐爁loat nLengh;??
  ?牐?//从树枝的起点计算树枝的终点
  ?牐爔1=x+Lengh*cos(StartAngle*3.14/180);?牔?
  ?牐爕1=y-Lengh*sin(StartAngle*3.14/180);?牔?
  ?牐?//绘制树枝,实际就是画一条线
  ?牐爌DC->MoveTo(x,y);?牔?
  ?牐爌DC->LineTo(x1,y1);?牔?
  ?牐?//pDC->SetPixel(x1,y1,RGB(255,0,0));?牐牔?
  ?牐?//如果树枝的长度小于预定的树枝长度最小值,则返回
  ?牐?//这一步很重要,否则递归就会陷入死循环
  ?牐爄f(Lengh<LAST_BRANCH_LENGTH)??
  ?牐爎eturn;??
  ?牐爊Lengh=Lengh;??
  ?牐爊x=x;??
  ?牐爊y=y;??
  ?牐爁or(count=0;count<BRANCH_NUM;count++)??
  ?牐爗??
  ?牐?//改变树枝的起点
  ?牐爊x+=nLengh*(1-CUT_RATE)*cos(StartAngle*3.14/180);?牔?
  ?牐爊y-=nLengh*(1-CUT_RATE)*sin(StartAngle*3.14/180);?牔?
  ?牐?//递归调用DrawBranch,画树枝的左边部份
  ?牐燚rawBranch(nx,ny,nLengh*1-CUT_RATE),StartAngle+LEFT_BRANCH_ANGLE,pDC);?牔?
  ?牐?//画树枝的右边部份
  ?牐燚rawBranch(nx,ny,nLengh*1-CUT_RATE),StartAngle-RIGHT_BRANCH_ANGLE,pDC);?牔?
  ?牐爊Lengh*=CUT_RATE;??
  ?牐爙??
  ?牐爙??
  ?牐爒oid CFractalView::OnDraw(CDC*pDC)??
  ?牐爗??
  ?牐燙Rect rect;??
  ?牐爐his->GetClientRect(&rect);?牔?
  ?牐燘eginWaitCursor();?煟牔?
  ?牐燚rawBranch(rect.left+rect.Width()/2,rect.bottom,BRANCH_LENGTH,90,this->GetDC());?煟牐牔?
  ?牐燛ndWaitCursor();?煟牔?
  ?牐燙FractalDoc*pDoc=GetDocument();?煟牔?
  ?牐燗SSERT_VALID(pDoc);?牔?
  ?牐爙??
  ?牐牶昧耍嘁肷厦娴某绦颍谠诵惺保慊岱⑾忠豢檬鞔有〉酱蟮纳す蹋苡腥ぁS捎诔绦虿捎玫氖堑莨榈饔玫姆绞剑绦蛟诵械乃俣扔行┞H绻牖嬷萍?冠花图片,只需要将预定义部分的代码替换成下面所示的代码。
  ?牐?#include “math.h”
  ?牐?#define CUT_RATE 0.3
  ?牐?#define LEFT_BRANCH_ANGLE 9
  ?牐?#define RIGHT_BRANCH_ANGLE 9
  ?牐?#define BRANCH_LENGTH 100
  ?牐?#define LAST_BRANCH_LENGTH 0.8
  ?牐?#define BRANCH_NUM 3
  ?牐犕苯厦娲胫械摹皃DC->LineTo(x1,y1);”换成“pDC->SetPixel(x1,y1,RGB(255,0,0));”即可。如果你还想得到更丰富的分形图片,你只须不断地更改上面的预定义部分代码。会得到什么样的精彩结果?我不知道,因为:没有两幅分形图片是一样的!
  ?牐犗嘈糯蠹蚁衷诙苑中瓮加辛烁羁痰娜鲜读税桑炕共豢炜於种谱鞒鲎约喝衔蠲览龅耐及福?