- XLogo
Random Branch Length
In the first program, each new tree has branches three quaters
(0.75) the length of the current branch. If we change this value,
the whole tree is drawn proportionally smaller or larger.
However, if we randomize this
value, then each branch has a random length, which creates a more
natural looking tree. Also, some branches truncate early, as they
become too short (and others go on for longer). Length is set to ((Random
4)+6)/10, which gives a value between 0.6 and just under 1.0.
The go procedure has been modified to draw 99 random trees,
with a short pause inbetween.
To New
# set default screen, pen and turtle values
ResetAll SetScreenSize [400 400] HideTurtle
SetSC Black SetPC Green SetPS 1 PenUp
End
To Tree :Length
If :Length< 10 [Stop] # ends recursion if branch length too small
SetPW :Length/9 # reduce pen width as branch length gets smaller
SetPC TreeCol :Length # branch color depends on length
Forward :Length Left :Angle/2
Tree :Length * Pick [0.7 0.75 0.8] Right :Angle
Tree :Length * Pick [0.7 0.75 0.8] Left :Angle/2
PenUp Back :Length PenDown # return to starting point
End
To TreeCol :Length
Make "Green Round 2.5*(100-:Length) # green depends on length
Output ( List 255 :Green 0 ) # red set to 255 and blue to 0
End
To Go
Repeat 12 [
New PenUp Back 160 PenDown
Make "Angle 60 Tree 80 Wait 200]
End
Random Branch Angle
Alternativley, we can randomly alter the branch angle for each
new tree. We now need two parameters for each procedure, length and
angle. Length is reset to three quaters (0.75) as before. Angle is
set to ((Random 60)+25), which gives a value between 25 and 85 degrees.
This produces trees of a slightly messy, mixed specimen appearance.
To New
# set default screen, pen and turtle values
ResetAll SetScreenSize [400 400] HideTurtle
SetSC Black SetPC Green SetPS 1 PenUp
End
To Tree :Length
If :Length< 10 [Stop] # ends recursion if branch length too small
SetPW :Length/9 # reduce pen width as branch length gets smaller
SetPC TreeCol :Length # branch color depends on length
LocalMake "Angle Pick [24 32 40 48 56 64 72]
Forward :Length Left :Angle/2
Tree :Length*0.75 Right :Angle # tree proc with 3/4 branch length
Tree :Length*0.75 Left :Angle/2
PenUp Back :Length PenDown # return to starting point
End
To TreeCol :Length
Make "Green Round 2.5*(100-:Length) # green depends on length
Output ( List 255 :Green 0 ) # red set to 255 and blue to 0
End
To Go
Repeat 12 [ New PenUp Back 160 PenDown
Tree 90 Wait 200]
End
Random Tree Angle
Finally, we can alter the angle between one tree procedure
and the next. I've named this 'TreeAngle' and used a procedure to
return a TreeAngle of Random (:Angle-10)+:Angle/10,
which for an :Angle of 50 degrees, gives a value between 5 and 45 degrees.
Again, changing this angle (to say 70)
generates different types of random trees (or shrubs).
To New
# set default screen, pen and turtle values
ResetAll SetScreenSize [400 400] HideTurtle
SetSC Black SetPC Green SetPS 1 PenUp
End
To Tree :Length
If :Length< 10 [Stop] # ends recursion if branch length too small
SetPW :Length/9 # reduce pen width as branch length gets smaller
SetPC TreeCol :Length # branch color depends on length
LocalMake "TreeAngle :Angle*Pick [0.25 0.375 0.5 0.625 0.75]
Forward :Length
Left :TreeAngle
Tree :Length*0.75 Right :Angle # tree proc with 3/4 branch length
Tree :Length*0.75 Left :Angle
Right :TreeAngle
PenUp Back :Length PenDown # return to starting point
End
To TreeCol :Length
Make "Green Round 2.5*(100-:Length) # green depends on length
Output ( List 255 :Green 0 ) # red set to 255 and blue to 0
End
To Go
Repeat 12 [ New PenUp Back 160 PenDown
Make "Angle 60 Tree 80 Wait 200]
End