vector $start1 = << 0, 0, 0 >>; float $angZ = 0; float $angX = 0; string $f1 = generateLsystem("F",3); string $f[] = stringToStringArray($f1, " "); drawPlant($f, $angZ, $angX, $start1); global proc string[] drawPlant(string $Fstring[], float $angle, float $xangle, vector $start) { while( size($Fstring) > 0) { if($Fstring[0] == "F") { float $newy1 = $start.y + 1; float $newy2 = $start.y + 2; float $newy3 = $start.y + 3; curve -d 3 -p ($start.x) ($start.y) ($start.z) -p ($start.x) ($newy1) ($start.z) -p ($start.x) ($newy2) ($start.z) -p ($start.x) ($newy3) ($start.z) -k 0 -k 0 -k 0 -k 1 -k 1 -k 1 ; rotate -r -p ($start.x) ($start.y) ($start.z) -rotateZ $angle; rotate -r -p ($start.x) ($start.y) ($start.z) -rotateX $xangle; $start = `pointOnCurve -pr 1 -p`; //$start = << ($start.x), ($newy3), ($start.z) >>; stringArrayRemoveAtIndex(0, $Fstring); } else if($Fstring[0] == "[") { stringArrayRemoveAtIndex(0, $Fstring); $Fstring = drawPlant($Fstring, $angle, $xangle, $start); } else if($Fstring[0] == "]") { polyCube -w 0.5 -h 0.5 -d 0.5; move -r ($start.x) ($start.y) ($start.z); stringArrayRemoveAtIndex(0, $Fstring); refresh; break; } else if($Fstring[0] == "-") { $angle = -30+ $angle; stringArrayRemoveAtIndex(0, $Fstring); } else if($Fstring[0] == "+") { $angle = 30 + $angle; stringArrayRemoveAtIndex(0, $Fstring); } else if($Fstring[0] == "*") { $xangle = 30 + $xangle; stringArrayRemoveAtIndex(0, $Fstring); } else if($Fstring[0] == "%") { $xangle = -30 + $xangle; stringArrayRemoveAtIndex(0, $Fstring); } } return $Fstring; }; global proc string generateLsystem(string $f, int $iters){ // RULE is F -> F [ - F F ] F [ + F F ] F int $i = 0; for($i = 0; $i < $iters; $i++) { $f = substituteAllString($f, "F", "F [ - F F ] F [ % F F ] F [ + F F ] F [ * F F ] F"); } return $f; }