flash绘图API:绘制植物(2)


  这个代码是很久之前移植一个java 关于L系统相关的图形代码,改成了AS3的版本,鉴于之前有人问到,现在公开一下,方便有需要的人进行学习。

关于L系统的图案,可以查看相关资料。好了,该去睡觉了。88

changeRule(7);
改变这个数字 可以看到不同的图案,好了。睡觉去,有问题欢迎留言,我会关注和留意。


package 
{
	import flash.display.Sprite;
	import flash.events.*;
	import flash.geom.*;
	import flash.display.Graphics;
	import flash.filters.*;

	public class Main extends Sprite
	{
		//开始坐标
		private var startX:Number=200;
		private var startY:Number=20;
		private var _rotation:Number;//角度
		private var StartDepth:int=7;//迭代次数
		private var ruleNumber:int=2;//规则数
		private var lengthF:Number=3.3;//布举 
		private var direction:Number=90;
		private var direction_init:Number=60;//开始方向角度 
		private var b:Point;//点
		private var a:Point;//点
		private var sStart:String;
		private var sRule:Array;
		public function Main()
		{
			init();
		}
		//初始化
		private function init():void
		{
			//this.filters=[new GlowFilter(0xffffff)];
			sRule=[["",""],["",""]];
			//sRule = new String [10][2];
			sStart = "G";
			sRule[0][0]="G";
			sRule[0][1]="GFX[+++++GFG][-----GFG]";
			sRule[1][0]="X";
			sRule[1][1]="F-XF";

			a = new Point(300,20);//开始点
			//direction = direction_init;//开始角度
			changeRule(7);
			paint(this.graphics,sStart,StartDepth);
		}
		//绘图
		private function paint(g:Graphics,instruction:String,depth:int):void
		{
			if (depth==0)
			{
				return;
			}//当等于0的时候停止
			depth-=1;//递减深度   
			var aPoint:Array = new Array();//用堆栈记录[]中的内容
			var aDirection:Array = new Array();
			var sDirection:String;

			var char:String;//字符
			for (var i:int=0; i<instruction.length; i++)
			{
				char=instruction.charAt(i);//获取单个字符
				trace(char);
				for (var j:int=0; j<ruleNumber; j++)
				{
					if (char==sRule[j][0].charAt(0))
					{
						paint(g,sRule[j][1],depth);
						break;
					}
				}
				if (char=="F")
				{
					if (depth==0||j==ruleNumber)
					{
						//trace(j);
						var rad:Number = Math.PI*direction/180;// 角度转换
						var p:Number = lengthF * Math.cos(rad);
						var q:Number = lengthF * Math.sin(rad);
						b=new Point(a.x+p,a.y+q);
						drawLine(g,a.x,400-a.y,b.x,400-b.y);//绘线
						a=b;
					}
				}
				else if (char=="+")
				{
					direction+=_rotation;
				}
				else if (char=="-")
				{
					direction-=_rotation;
				}
				else if (char=="[")
				{//入栈
					aPoint.push(a);
					sDirection = String(direction);
					aDirection.push(sDirection);

				}
				else if (char=="]")
				{
					a=aPoint[aPoint.length-1];
					sDirection=aDirection[aDirection.length-1];
					direction=Number(sDirection);
					aPoint.splice(aPoint.length-1,1);
					aDirection.splice(aDirection.length-1,1);
				}//出栈
			}
		}


		//改变规则
		private function changeRule(id:int):void
		{

			if (id==1)
			{
				startX =200;
				startY =20;
				direction_init =90;
				lengthF =4.5;
				_rotation =30;
				StartDepth =5;
				ruleNumber =1;
				sStart = "F";
				sRule[0][0]="F";
				sRule[0][1]="F[+F[+F][-F]F][-F[+F][-F]F]F[+F][-F]F";
			}
			if (id==2)
			{
				startX =200;
				startY =10;
				direction_init =90;
				lengthF =0.37;
				_rotation =30;
				StartDepth = 10;
				ruleNumber =2;
				sStart = "Y";
				sRule[0][0]="X";
				sRule[0][1]="X[-FFF][+FFF]FX";
				sRule[1][0]="Y";
				sRule[1][1]="YFX[+Y][-Y]";


			}
			if (id==3)
			{

				startX =170;
				startY =0;
				direction_init =90;
				lengthF =7;
				_rotation =-22.5;
				StartDepth =5;
				ruleNumber =1;
				sStart = "F";
				sRule[0][0]="F";
				sRule[0][1]="FF+[+F-F-F]-[-F+F+F]";


			}
			if (id==4)
			{

				startX =30;
				startY =40;
				direction_init =0;
				lengthF =13;
				_rotation =90;
				StartDepth = 4;
				ruleNumber =2;
				sStart = "X";
				sRule[0][0]="X";
				sRule[0][1]="XFYFX+F+YFXFY-F-XFYFX";
				sRule[1][0]="Y";
				sRule[1][1]="YFXFY-F-XFYFX+F+YFXFY";


			}

			if (id==5)
			{

				startX =200;
				startY =10;
				direction_init =90;
				lengthF =0.37;
				_rotation =30;
				StartDepth = 10;
				ruleNumber =2;
				sStart = "Y";
				sRule[0][0]="X";
				sRule[0][1]="X[-FFF][+FFF]FX";
				sRule[1][0]="Y";
				sRule[1][1]="YFX[+Y][-Y]";


			}
			if (id==6)
			{
				startX =200;
				startY =10;
				direction_init =90;
				lengthF =3;
				_rotation =-30;
				StartDepth = 8;
				ruleNumber =2;
				sStart = "G";
				sRule[0][0]="G";
				sRule[0][1]="[+FGF][-FGF]XG";
				sRule[1][0]="X";
				sRule[1][1]="XFX";

			}
			if (id==7)
			{
				startX =200;
				startY =10;
				direction_init =90;
				lengthF =0.35;
				_rotation =30;
				StartDepth = 10;
				ruleNumber =2;
				sStart = "X";
				sRule[0][0]="X";
				sRule[0][1]="F[+X]F[-X]+X";
				sRule[1][0]="F";
				sRule[1][1]="FF";


			}

		}
		//画线
		private function drawLine(g:Graphics,startX:Number,startY:Number,endX:Number,endY:Number):void
		{
			g.lineStyle(1,0x006600);
			g.moveTo(startX,startY);
			g.lineTo(endX,endY);
		}
		//重画
		private function rePait():void
		{

		}
	}
}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值