// TREE - draw a tree using recursive techniques.

// globals...
set reduce_factor = 0   // amount that each successive generation will be reduced by (relative to parent)
set forkang = 0     // basic fork angle to be used..
set rand_factor = 0 // amount of randomness to introduce into fork angles .. 0 = none
set rand_fork = 0   // likelyhood of a random fork being added 0 = impossible .. 10 = always
set windswept = 5   // whether to favor forking to left or right   5 = none  0 = extreme right  10 = extreme left


//////////////////////////////////////////////////////////////////////////////////////
// TWIG - this procedure draws a fork-shaped twig and then calls itself for every twig-end..
//        It can also do an extra random fork too.

to twig :len :recurs

  // save turtle position, direction, etc...
  set t1 = turtle		

  if :rand_factor > 0 [
    if random 10 < :windswept [ lt random :rand_factor ]
    else [ rt random :rand_factor ]
    ]

  wait 5
  pd
  if random 10 < :rand_fork [   // add a random fork..
     set pt = turtle
     fd random :len
     if random 10 < :windswept [ lt random 50 ]
     else [ rt random 50 ]
     fd random (calc :len * 0.4)
     if :recurs > 0 [ twig (calc :len * :reduce_factor) (calc :recurs - 1) ]
     logo turtle = :pt
     ]
  fd :len 
  lt (calc :forkang / 2)
  fd :len
  if :recurs > 0 [ twig (calc :len * :reduce_factor) (calc :recurs - 1) ]
  bk :len
  rt :forkang
  fd :len
  if :recurs > 0 [ twig (calc :len * :reduce_factor) (calc :recurs - 1) ]
  pu
  // restore original turtle..
  logo turtle = :t1			
end


/////////////////////////////////////////
// TREE begins here...
/////////////////////////////////////////

repeat untilbreak [
  set ngen = buttonchoice "Starting a tree.. \n How many generations?" "2|3|4|5|6|Quit"
  if :ngen = "quit" [ break ]

  set firstsize = buttonchoice "Trunk size:" "75|100|150|200|250"
  set forkang = buttonchoice "Fork angle (degrees):" "10|20|30|40|50|60|75|90|110"

  set reduce_factor = buttonchoice 
	"Each new generation should be __ the size\nof the current generation:" 
	"0.3|0.4|0.5|0.6"

  set rand_factor = buttonchoice "Branch direction randomness:" "None|5|10|20|40|50|60|70|80|100"
  if :rand_factor = "none" [ set rand_factor = 0 ]

  set rand_fork = buttonchoice "Likelyhood of random forks:" "None|1|2|3|4|5|6|7|8|9|10"
  if :rand_fork = "none" [ set rand_fork = 0 ]

  clear
  logo linecolor = "green"
  pu; moveto 0 100; pd; moveto winwide 100;
  logo linethick = 0.5
  pu; moveto center 100
  logo turtledir = 0
  twig :firstsize :ngen
  if buttonchoice "" "Go again|Quit" = "quit"  [ break ]
  ]
