#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 void CMyBranchView::OnDraw(CDC* pDC) { CMyBranchDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; this->GetClientRect(&rect); BeginWaitCursor(); DrawBranch(rect.left+rect.Width()/2,rect.bottom,BRANCH_LENGTH,90,pDC); EndWaitCursor(); } void CMyBranchView::DrawBranch(int x, int y, float length, int startAngle, CDC *pDC) { float x1,y1,nx,ny,count; float nLength; //从树枝的起点计算树枝的终点 x1=x+length*cos(startAngle*3.14/180); y1=y-length*sin(startAngle*3.14/180); //绘制树枝,实际上就是画一条线 pDC->MoveTo(x,y); pDC->LineTo(x1,y1); //pDC->SetPixel(x1,y1,RGB(255,0,0)); //如果树枝的长度小于预定的树枝长度最小值,则返回 //这步很重要否则就会陷入死循环 if (length<LAST_BRANCH_LENGTH) { return ; } nLength=length; nx=x; ny=y; for (count=0;count<BRANCH_NUM;count++) { //改变树枝的起点 nx+=nLength*(1-CUT_RATE)*cos(startAngle*3.14/180); ny-=nLength*(1-CUT_RATE)*sin(startAngle*3.14/180); //递归调用 左 DrawBranch(nx,ny,nLength*(1-CUT_RATE),startAngle+LEFT_BRANCH_ANGLE,pDC); //递归调用 右 DrawBranch(nx,ny,nLength*(1-CUT_RATE),startAngle-RIGHT_BRANCH_ANGLE,pDC); } }