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