1. 下面代码需要插入到MFC项目中运行,实现了计算机图形学中的L系统分形树。
  2.  
  3. class Node
  4. {
  5. public:
  6. int x,y;
  7. double direction;
  8. Node(){}
  9. };
  10.  
  11. CString way[3] ;//提供三种生成规则
  12. CString rule,temprule;
  13. int len ; //单步长
  14. int angle; //旋转转角度
  15. int degree ; //迭代次数
  16. int x,y ; //原点坐标
  17. Node stack[1024];
  18. int stackpointer;
  19. CTest18View::CTest18View()
  20. {
  21. way[0] = "F[+F]F[-F]F";
  22. way[1] = "F[+F]F[-F[+F]]";
  23. way[2] = "FF-[-F+F+F]+[+F-F-F]";
  24. len =3 ;
  25. angle = 30 ;
  26. degree =5;
  27. x = 400 ;
  28. y = 500 ;
  29. stackpointer = 0 ;
  30. for (int i = 0 ; i <1024 ; i++ )
  31. {
  32. stack[i].x = 0 ;
  33. stack[i].direction = NULL ;
  34. }
  35. rule = way[rand() % 3] ;
  36. for ( int i=1;i<= degree;i++)
  37. {
  38. int curlen = temprule.GetLength ();
  39. int pos=0 , j = 0 ;
  40. while (j < curlen)
  41. {
  42. if(temprule[j] == 'F' )
  43. {
  44. rule += way[rand()%3 ];
  45. j++;
  46. pos = rule.GetLength()-1 ;
  47. }
  48. else
  49. {
  50. rule += temprule[j] ;
  51. pos ++;
  52. j++;
  53. }
  54. }
  55. temprule = rule ;
  56. rule.Empty();
  57. }
  58. rule = temprule ;
  59. }
  60.  
  61. void CTest18View::OnDraw(CDC* pDC)
  62. {
  63. CTest18Doc* pDoc = GetDocument();
  64. ASSERT_VALID(pDoc);
  65. if (!pDoc)
  66. return;
  67. CPen pen(PS_SOLID,1,RGB(0,0,255));
  68. pDC->SelectObject(pen);
  69. Node Nextnode ,Curnode;
  70. Curnode.x = x ;
  71. Curnode.y = y ;
  72. Curnode.direction = 90 ;
  73. int length =rule.GetLength ();
  74. int i = 0;
  75. pDC ->MoveTo (x,y);
  76. while (i<length)
  77. {
  78. switch(rule[i])
  79. {
  80. case 'F':
  81. Nextnode.x = Curnode.x + len * cos(Curnode.direction * PI /180);
  82. Nextnode.y = Curnode.y - len * sin(Curnode.direction * PI /180);
  83. Nextnode.direction =Curnode.direction ;
  84. pDC ->LineTo (Nextnode.x,Nextnode.y);
  85. Curnode = Nextnode;
  86. break ;
  87. case '[':
  88. stack[stackpointer] = Curnode;
  89. stackpointer ++;
  90. break;
  91. case ']':
  92. Curnode = stack[stackpointer-1];
  93. stackpointer -- ;
  94. pDC ->MoveTo (Curnode.x,Curnode.y);
  95. break;
  96. case '+':
  97. Curnode.direction = Curnode.direction + angle;
  98. break;
  99. case '-':
  100. Curnode.direction = Curnode.direction -angle;
  101. break;
  102. default:
  103. ;
  104. }
  105. i++;
  106. }
  107. }

效果图如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

随机L系统分形树 分类: 计算机图形学 2014-06-01 23:27 376人阅读 评论(0) 收藏的更多相关文章

  1. HDU 1272 小希的迷宫(并查集) 分类: 并查集 2015-07-07 23:38 2人阅读 评论(0) 收藏

    Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...

  2. OC基础:继承.初始化方法,便利构造器 分类: ios学习 OC 2015-06-16 19:27 84人阅读 评论(0) 收藏

    继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的 ...

  3. 利用autotools工具制作从源代码安装的软件 分类: linux 2014-06-02 23:27 340人阅读 评论(0) 收藏

    编写程序(helloworld.c)并将其放到一个单独目录. helloworld.c: #include<stdio.h> int main() { printf("hello ...

  4. javascript中定义事件的三种方式 分类: C1_HTML/JS/JQUERY 2014-08-07 10:27 634人阅读 评论(0) 收藏

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...

  5. HDU 2040 亲和数 [补] 分类: ACM 2015-06-25 23:10 10人阅读 评论(0) 收藏

    今天和昨天都没有做题,昨天是因为复习太累后面忘了,今天也是上午考毛概,下午又忙着复习计算机图形学,晚上也是忘了结果打了暗黑3,把暗黑3 打通关了,以后都不会玩太多游戏了,争取明天做3题把题目补上,拖越 ...

  6. Cubieboard 开箱和入门 | Name5566 分类: cubieboard 2014-11-08 17:27 251人阅读 评论(0) 收藏

    Cubieboard 开箱和入门 2014 年 01 月 29 日 by name5566 Categories: Computer Science, Cubieboard Hello Cubiebo ...

  7. 随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏

    本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比. 程序用一次遍历,实现带权随机选取. 算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+... ...

  8. NoSql中的B-tree、B+tree和LSM-tree 分类: B7_HBASE 2015-03-15 18:27 85人阅读 评论(0) 收藏

    总结: 1.B+树将数据完全排序,读数据时很快,但当要修改数据时,就需要将新入数据下面的数据重新排位,特别是当写入的数据排在较高的位置时,需要大量的移位操作才能完成写入. 2.SLM牺牲部分的读性能, ...

  9. 全面解析sizeof(上) 分类: C/C++ StudyNotes 2015-06-15 10:18 188人阅读 评论(0) 收藏

    以下代码使用平台是Windows7 64bits+VS2012. sizeof是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对齐有个全 ...

随机推荐

  1. [Unit Testing] Mock an HTTP request using Nock while unit testing

    When testing functions that make HTTP requests, it's not preferable for those requests to actually r ...

  2. webpack-Dependency Graph(依赖图)

    依赖图(Dependency Graph) 任何时候,一个文件依赖于另一个文件,webpack 就把此视为文件之间有依赖关系. 这使得 webpack 可以接收非代码资源(non-code asset ...

  3. hibernate4中HHH000273的错误

    今天配置hibernate4.发现报 17:55:06,815 INFO AbstractPoolBackedDataSource:522 - Initializing c3p0 pool... co ...

  4. Java中常见的排序算法

    这是我摘取的一段英文资料.我认为学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At ...

  5. HTML的简单学习

    <html>与</html>之间的部分用来描述网页. <body>与</body>之间是页面的可见的内容. <h1>与</h1> ...

  6. HDOJ 4455 Substrings 递推+树状数组

    pre[i]第i位数往前走多少位碰到和它同样的数 dp[i]表示长度为i的子串,dp[i]能够由dp[i-1]加上从i到n的pre[i]>i-1的数减去最后一段长度为i-1的断中的不同的数得到. ...

  7. 浅谈JavaScript的面向对象程序设计(三)

    前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性.对象的工厂模式.构造函数和原型等.通过介绍,这些创建对象的方法依然有不少优化和改进的地方. 组合使用构造函数模式和原型 ...

  8. web 开发之js---ajax 中的两种返回状态 xmlhttp.status和 xmlhttp.readyState

    (1)xmlhttp.status xmlHttp.status的值(HTTP状态表)0**:未被始化 1**:请求收到,继续处理 2**:操作成功收到,分析.接受 3**:完成此请求必须进一步处理 ...

  9. Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现

    pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ...

  10. redis与spring整合·

    单机版: 配置spring配置文件applicationContext.xml <?xml version="1.0" encoding="UTF-8"? ...