# Main Command: GoX # L_System by Guy Walker # www.logoarts.co.uk to new # set default screen, pen and turtle ResetAll SetScreenSize [400 400] HideTurtle SetSC Black SetPC Green SetPS 1 PenUp end to display :lsys :order # write header title, curve depth and info SetPC White SetPos [-190 184] Label (List "L-System: :LSys :Name) SetPos [-190 -192] Label (List "Rule: "F: :Rule) SetPos [130 -192] Label List "Axiom: :Axiom SetPos [130 184] Label List "Order: :Order SetPos [130 170] Label List "Angle: :Angle end to generate :string :order If :Order < 1 [Output :String] Output Generate (ReWrite :String) :Order-1 end to rewrite :string # replace every F with rule Make "NewString " For (List "N 1 Count :String) [ Make "Symbol Item :N :String If :Symbol = "F [Make "NewString Word :NewString :Rule] [ Make "NewString Word :NewString :Symbol] ] Output :NewString end to draw :string # render each symbol in string ForEach "Symbol :String [ If :Symbol = "F [Forward :Step] [ If :Symbol = "+ [Right :Angle] [ If :Symbol = "- [Left :Angle] ] ] ] end to l_sys1 :order Make "Name "Snowflake_Curve Make "Scale 3 Make "Angle 60 Make "Rule "F-F++F-F end to l_sys2 :order Make "Name "Koch_Square Make "Scale 3 Make "Angle 90 Make "Rule "F-F+F+F-F end to l_sys3 :order Make "Name "Peano_Curve Make "Scale 3 Make "Angle 90 Make "Rule "F-F+F+F+F-F-F-F+F end to l_sys4 :order Make "Name "Quadratic_Koch_Curve Make "Scale 4 Make "Angle 90 Make "Rule "F+F-F-FF+F+F-F # or add in extra central F end to l_sys5 :order Make "Name "Modified_Snowflake_Curve Make "Scale 4 Make "Angle 60 Make "Rule "F-F+F+F-F end to l_sys6 :order Make "Name "Modified_Snowflake_Curve2 Make "Scale 4 Make "Angle 60 Make "Rule "F-F++FF--F+F end to l_sys7 :order Make "Name "Modified_Snowflake_Curve3 Make "Scale 3 Make "Angle 60 Make "Rule "F-F++F++F--F--F+F end to go :lsys :order New Make "Screen 384 Make "Axiom "F Wash Home Run Word "L_Sys :LSys :Order Display :Lsys :Order SetPC Green Make "Step :Screen/Power :Scale :Order Make "DrawString Generate :Axiom :Order If :Order < 2 [Print :DrawString] [Print [printout supressed] ] SetPos List Minus :Screen/2 0 SetH 90 PenDown Draw :DrawString PenUp end to gox New Make "Screen 384 Make "Order 3 Make "Axiom "F For [LSys 1 7] [ Wash Home Make "Step :Screen Run Word "L_Sys :LSys :Order Display :Lsys :Order Make "DrawString :Axiom For (List "Ord 1 :Order) [ Make "DrawString ReWrite :DrawString SetPos List Minus :Screen/2 0 SetH 90 Make "Step :Step / :Scale SetPC Item :Ord [3 1 6 2] SetPW Item (:Order+1)-:Ord [1 5 9 11] PenDown Draw :DrawString PenUp Wait 60] Wait 120] end