【作业】简单分形树绘制程序
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文法绘制简单的分形树的功能,双击窗体会显示不同的分形树。需要解决的问题比如数据的序列化问题,数据的缓冲处理,当数据量很大的时候重绘必须用的缓冲机制。
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
分类:
编程开发集合 / C++/STL
标签:
VC++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律