-- Zeichnet eine linie zwischen start und end fn drawLine start end = ( l = line pos:start addNewSpline l addKnot l 1 #corner #line start addKnot l 1 #corner #line end updateShape l l ) -- produziert aus dem lsystem einen string fn calcLSystem prod start iterations = ( string = start for i = 1 to iterations do ( tmp = "" for j = 1 to string.count do ( prodExists = false for k = 1 to prod.count do ( if (string[j] == prod[k][1]) then ( tmp += prod[k][2] prodExists = true ) ) if(prodExists == false) then ( tmp += string[j] ) ) string = tmp ) print string ) fn drawLSystem prod start iterations startpos startdir angle length = ( curpos = startpos vec = length * (normalize startdir) string = calcLSystem prod start iterations lStack = #() ln = line pos:curpos spline = addNewSpline ln addKnot ln spline #corner #line curpos for i = 0 to string.count do( action = string[i] if(action == "F") then( -- drawLine curpos (curpos+vec) addKnot ln spline #corner #line (curpos + vec) curpos = curpos + vec )else if(action == "+") then( --vec = vec * (rotateYPRMatrix 0 0 angle) angle = abs angle ) else if(action == "-") then( --vec = vec * (rotateYPRMatrix 0 0 -angle) angle = -(abs angle) )else if(action == "A") then( -- drawLine curpos (curpos+vec) addKnot ln spline #corner #line (curpos + vec) curpos = curpos + vec )else if(action == "B") then( -- drawLine curpos (curpos+vec) addKnot ln spline #corner #line (curpos + vec) curpos = curpos + vec ) else if(action == "[") then( append lStack #(curpos, vec) ) else if(action == "]") then( curpos = lStack[lStack.count][1] vec = lStack[lStack.count][2] deleteItem lStack lStack.count spline = addnewSpline ln -- 2 Knoten hinzufügen damit keine fehler auftreten. ein spline muss zumindest aus einer line bestehen, es ist aber nicht garantiert, dass das lsystem eine linie generiert. addKnot ln spline #corner #line curpos addKnot ln spline #corner #line curpos )else if(action == "y") then( vec = vec * (rotateYPRMatrix angle 0 0) ) else if(action == "p") then( vec = vec * (rotateYPRMatrix 0 angle 0) ) else if(action == "r") then( vec = vec * (rotateYPRMatrix 0 0 angle) ) else( ) ) updateShape ln ) -- Kuch Curve 1 --prod = #( #("A", "B-rA-rB"), #("B", "A+rB+rA") ) --start = "A" --lAngle = 60 --startpos = [0,0,0] --startdir = [1,0,0] -- Koch Curve 2 --prod = #( #("F", "F+rF-rF-rF+rF") ) --start = "F" --lAngle = 90 --startpos = [0,0,0] --startdir = [1,0,0] -- Koch Curve 3 prod = #(#("F", "F-rF+r+rF-rF")) start = "F+r+rF+r+rF" lAngle = 60 startpos = [0,0,0] startdir = [1,0,0] -- FractalPlant --prod = #(#("X", "F-yr[[X]+ryX]+ryF[+ryFX]-ryX"), #("F", "FF")) --start="X" --lAngle = 25 --startpos = [0,0,0] --startdir = [0,0,1] drawLSystem prod start 3 startpos startdir lAngle 1