这个代码是很久之前移植一个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 { } } }