1.项目名称:简单分形树绘制程序
2.项目内容
设计一个简单的分形树显示程序,能够绘制几棵分形的树状图形。
3.功能设计思路
利用MFC制作这样一个绘图程序!采用随机LS文法,该方法在LS文法中引入随机变量。通过鼠标双击视图变化生成的分形植物,可以提高自己对于MFC基本架构的理解,提高自己的VC++编程能力,对于分形算法有所理解!
4.编码实施
首先建立一个利用向导生成一个MFC程序名为Tree;
右击菜单画圆在类向导中为CCTdrawView类添加OnLButtonDblClk事件,
为CCTdrawView添加变量:
CString unit[3] ;
CString tree , formtree;
int len ;
int angle;
int degree ;
int ox,oy ; //原点坐标
CKNOT stack[1024];
int stackpushpos;
添加代码如下:
1 voidCMyTreeView::OnLButtonDblClk(UINT nFlags, CPoint point)2 {3 /构造函数,用于类的初始化///4 for (int i = 0 ; i <1024 ; i++)5 {6 stack[i].x = 0;7 stack[i].direction =NULL ;8 }9 stackpushpos = 0;10 formtree = unit[rand() % 3] ;11 tree.Empty ();12 //
13 intrandom ;14 for ( i = 1 ; i <= degree ; i++)15 {16 int curlen =formtree.GetLength ();17 int pos=0 , j = 0;18 while (j
28 {29 tree +=formtree[j] ;30 pos ++;31 j++;32 }33 }34 formtree =tree ;35 tree.Empty ();36 }37 tree =formtree ;38 Invalidate();39 }40 voidCMyTreeView::OnLButtonDblClk(UINT nFlags, CPoint point)41 {42 /鼠标双击事件的处理代码///
43 for (int i = 0 ; i <1024 ; i++)44 {45 stack[i].x = 0;46 stack[i].direction =NULL ;47 }48 stackpushpos = 0;49 formtree = unit[rand() % 3] ;50 tree.Empty ();51 //
52 intrandom ;53 for ( i = 1 ; i <= degree ; i++)54 {55 int curlen =formtree.GetLength ();56 int pos=0 , j = 0;57 while (j
67 {68 tree +=formtree[j] ;69 pos ++;70 j++;71 }72 }73
74 formtree =tree ;75
76 tree.Empty ();77 }78 tree =formtree ;79 Invalidate();80 }81 void CMyTreeView::OnDraw(CDC*pDC)82 {83 //绘制分形图形的代码84 CTreeDoc* pDoc =GetDocument();85 ASSERT_VALID(pDoc);86
87 AfxGetMainWnd()->SetWindowText("随机L系统(分形频道:fractal.cn)请双击窗体");88 if(tree.IsEmpty ())89 return;90 else
91 {92 CKNOT mNextKnot ,mCurKnot;93 mCurKnot.x =ox ;94 mCurKnot.y =oy ;95 mCurKnot.direction = 90;96 int treelength =tree.GetLength ();97 int i = 0;98 pDC ->MoveTo (ox,oy);99 while (iLineTo (mNextKnot.x ,mNextKnot.y);108 mCurKnot =mNextKnot ;109 break;110 case '[':111 stack[stackpushpos] =mCurKnot ;112 stackpushpos ++;113 break;114 case ']':115 mCurKnot = stack[stackpushpos-1];116 stackpushpos --;117 pDC ->MoveTo (mCurKnot.x,mCurKnot.y);118 break;119 case '+':120 mCurKnot.direction = mCurKnot.direction +angle;121 break;122 case '-':123 mCurKnot.direction = mCurKnot.direction -angle;124 break;125 default:126 ;127 }128 i++;129 }130 }131 //TODO: add draw code for native data here
132 }
5.功能实现
6.总结
本设计实现了利用随机LS文法绘制简单的分形树的功能,双击窗体会显示不同的分形树。需要解决的问题比如数据的序列化问题,数据的缓冲处理,当数据量很大的时候重绘必须用的缓冲机制。