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

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.功能实现

6.总结

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

 

posted @ 2012-10-11 10:29  太一吾鱼水  阅读(1397)  评论(0编辑  收藏  举报