下面代码需要插入到MFC项目中运行,实现了计算机图形学中的L系统分形树。

class  Node
{
public:
int x,y;
double direction;
Node(){}
}; CString way[3] ;//提供三种生成规则
CString rule,temprule;
int len ; //单步长
int angle; //旋转转角度
int degree ; //迭代次数
int x,y ; //原点坐标
Node stack[1024];
int stackpointer;
CTest18View::CTest18View()
{
way[0] = "F[+F]F[-F]F";
way[1] = "F[+F]F[-F[+F]]";
way[2] = "FF-[-F+F+F]+[+F-F-F]";
len =3 ;
angle = 30 ;
degree =5;
x = 400 ;
y = 500 ;
stackpointer = 0 ;
for (int i = 0 ; i <1024 ; i++ )
{
stack[i].x = 0 ;
stack[i].direction = NULL ;
}
rule = way[rand() % 3] ;
for ( int i=1;i<= degree;i++)
{
int curlen = temprule.GetLength ();
int pos=0 , j = 0 ;
while (j < curlen)
{
if(temprule[j] == 'F' )
{
rule += way[rand()%3 ];
j++;
pos = rule.GetLength()-1 ;
}
else
{
rule += temprule[j] ;
pos ++;
j++;
}
}
temprule = rule ;
rule.Empty();
}
rule = temprule ;
} void CTest18View::OnDraw(CDC* pDC)
{
CTest18Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPen pen(PS_SOLID,1,RGB(0,0,255));
pDC->SelectObject(pen);
Node Nextnode ,Curnode;
Curnode.x = x ;
Curnode.y = y ;
Curnode.direction = 90 ;
int length =rule.GetLength ();
int i = 0;
pDC ->MoveTo (x,y);
while (i<length)
{
switch(rule[i])
{
case 'F':
Nextnode.x = Curnode.x + len * cos(Curnode.direction * PI /180);
Nextnode.y = Curnode.y - len * sin(Curnode.direction * PI /180);
Nextnode.direction =Curnode.direction ;
pDC ->LineTo (Nextnode.x,Nextnode.y);
Curnode = Nextnode;
break ;
case '[':
stack[stackpointer] = Curnode;
stackpointer ++;
break;
case ']':
Curnode = stack[stackpointer-1];
stackpointer -- ;
pDC ->MoveTo (Curnode.x,Curnode.y);
break;
case '+':
Curnode.direction = Curnode.direction + angle;
break;
case '-':
Curnode.direction = Curnode.direction -angle;
break;
default:
;
}
i++;
}
}

效果图如下:

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

随机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. 【c++】c++一些基础面试题

    http://www.mianwww.com/html/2013/10/19128.html http://blog.csdn.net/wdzxl198/article/details/9050751 ...

  2. zookeeperclient设置监听

    1.目的 zookeeper是一个分布式服务管理框架.zookeeper提供了对client的通知.即在server端的节点有改动或者删除的时候,能够给client进行通知. 2.server端部署 ...

  3. C#中list比数组效率低多少

    对于List,即长度不确定的数组而言,十万笔数据*12倍,就是120万笔数据,只需要93ms左右   换成了二维数组,效果也是差不多,78ms,可见list的效率只比double差一点点  

  4. 谁是性能杀手?Kafka多Topic下启用SSL时延增大问题分析

    问题背景 项目中将Kafka接口进行RESTful封装,在使用RESTful接口进行性能测试时,发现Topic数增多后,开启SSL与非SSL进行测试,发现开启SSL后性能下降得厉害.例如600个Top ...

  5. ffmpeg+libx264+facc交叉编译 实现264流录制avi文件

    默认交叉编译器已经搭建好. .. . . . . .... .... 需求: 把标准的h264流保存成avi格式的实现文件,所以须要h264的解码器,avi文件容器,传输协议类型是文件.这些会体如今f ...

  6. 【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)

    [iOS系列]-iOS查看沙盒文件图文教程(真机+模拟器) 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString *path = [NSSearchPathFor ...

  7. 2016/05/25 Ajax 跨域 转

    起因: 起因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统:调用A系统以B为例.在B系统 中用ajax调用A系统系统的接口(数据格式为 ...

  8. LeetCode 1.两数之和(JS)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  9. c语言和oc对比

    1)源文件对比 思考&实现1: 1)在C语言中,我们遇到不同后缀的文件有哪些? .c .o .out .h 2.基本语法对比 1)数据类型对比学习 2)变量的定义对比 3)流程控制语句对比 1 ...

  10. 解耦与分离 —— 面向切面编程(AOP)

    家里的电表总结起来有两大特性: 电视机需要(电量管理),空调需要(电量管理),热水器也需要电量管理,即一组对象都需要某一功能特性: 电视机根据信号输出画面,空调吹出冷风,热水器将水加热,这些业务功能的 ...