随机L系统分形树 分类: 计算机图形学 2014-0...

下面代码需要插入到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++;
		}
}

效果图如下:


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

转载于:https://www.cnblogs.com/luo-peng/p/4646264.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值