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 void CMyTreeView::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 int random ;
14 for ( i = 1 ; i <= degree ; i++)
15 {
16 int curlen = formtree.GetLength ();
17 int pos=0 , j = 0 ;
18 while (j < curlen)
19 {
20 if(formtree[j] == 'F' )
21 {
22 random = rand() % 3 ;
23 tree += unit[random];
24 j++;
25 pos = tree.GetLength () -1 ;
26 }
27 else
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 void CMyTreeView::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 int random ;
53 for ( i = 1 ; i <= degree ; i++)
54 {
55 int curlen = formtree.GetLength ();
56 int pos=0 , j = 0 ;
57 while (j < curlen)
58 {
59 if(formtree[j] == 'F' )
60 {
61 random = rand() % 3 ;
62 tree += unit[random];
63 j++;
64 pos = tree.GetLength () -1 ;
65 }
66 else
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 (i<treelength)
100 {
101 switch(tree[i])
102 {
103 case 'F':
104 mNextKnot.x = mCurKnot.x + len * cos(mCurKnot.direction * PI /180);
105 mNextKnot.y = mCurKnot.y - len * sin(mCurKnot.direction * PI /180);
106 mNextKnot.direction = mCurKnot.direction ;
107 pDC ->LineTo (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.功能实现

【作业】简单分形树绘制程序_VC++

6.总结

         本设计实现了利用随机LS文法绘制简单的分形树的功能,双击窗体会显示不同的分形树。需要解决的问题比如数据的序列化问题,数据的缓冲处理,当数据量很大的时候重绘必须用的缓冲机制。