Programming Resources
For Fun and Learning
Charles Cusack
Computer Science
Hope College
main


Python


C++
JAVA
PHP
SQL
Assignments

Turtle


044_Fibonacci_Tree3.py

import math
import random
import os
from palettes import randomPalette
from util import getTurtleAndScreen
# Fibonacci tree.
# CAC, 4/24/2023

def dist(x,y,x2,y2):
    return math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))

def wobbleForward(turtle,distance):
    turtle.pendown()
    x,y=turtle.pos()
    xn,yn=x,y
    incr = 6
    limit = 8
    while dist(xn,yn,x,y) < distance:
        turtle.left(random.randint(-limit,limit))
        turtle.forward(incr)
        xn,yn=turtle.pos()

def fibTree(turtle,length,angle,level,colors,typeA,maxflex):
    realAngle=angle/2
    if level >0: # If level <=0, draw nothing.
        if typeA:
            turtle.color(random.choice(colors))
            turtle.left(random.randint(-maxflex,maxflex))
            wobbleForward(turtle, length)
            fibTree(turtle,length,angle,level-1,colors,False,maxflex)
        else:
            version = random.randint(0,1)
            x,y=turtle.pos()
            heading = turtle.heading()
            turtle.left(realAngle+random.randint(-maxflex,maxflex))
            turtle.color(random.choice(colors))
            wobbleForward(turtle, length)
            if version:
                fibTree(turtle,length,angle,level-1,colors,True,maxflex)
            else:
                fibTree(turtle,length,angle,level-1,colors,False,maxflex)
            turtle.penup()
            turtle.goto(x,y)
            turtle.setheading(heading-realAngle+random.randint(-maxflex,maxflex))
            turtle.pendown()
            turtle.color(random.choice(colors))
            wobbleForward(turtle, length)
            if version:
                fibTree(turtle,length,angle,level-1,colors,False,maxflex)
            else:
                fibTree(turtle,length,angle,level-1,colors,True,maxflex)

def Draw():
    level = random.randint(4,15)
    angle = random.randint(45,90)
    maxflex = random.randint(5,15)
    title = "Wavy Fibonacci Tree "+str(level)+" "+str(angle)+" "+str(maxflex)
    width = 800
    height = 600
    filename = os.path.basename(__file__)[0:-3]
    turtle, screen = getTurtleAndScreen(title,width,height,filename,moveWorld=True)

    colors = randomPalette()
    bg = random.choice(colors)
    colors.remove(bg)
    screen.bgcolor(bg)
    turtle.pensize(2)

    length = height/(1.5*level)

    turtle.penup()
    turtle.goto(width/2,height/4)
    turtle.pendown()

    turtle.setheading(90)
    fibTree(turtle,length,angle,level,colors,True,maxflex)

    turtle.penup()

    screen.mainloop()
# ----------------------------------------------------------------
if __name__ == '__main__':
   Draw()