zoukankan      html  css  js  c++  java
  • 【作业】简单分形树绘制程序

    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文法绘制简单的分形树的功能,双击窗体会显示不同的分形树。需要解决的问题比如数据的序列化问题,数据的缓冲处理,当数据量很大的时候重绘必须用的缓冲机制。

     

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    Studio之版本管理工具Git (图文教程)
    studio adb连接不上手机 ADB server didn't ACK
    studio-引入外来包
    TextView的属性列表
    java_ _反射
    SDcard进行文件的读取
    资源文件assets和 res下面raw文件的使用不同点
    android的照片浏览器(一)至返回所有图片文件
    使ViewStub 来提高UI的加载的性能
    安卓优化--
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2719507.html
Copyright © 2011-2022 走看看