Day 50 - Using Recursion to Create a Fractal Tree, Part 3

Fractals and recursion are two ideas that were made for each other. In videos 48-51, we will be exploring the ideas around fractals, recursive functions, and using randomization to make designs more interesting and realistic.

Starter Code

from turtle import *
import random
screen = Screen()


intMin = 30

def drawBranch(intDist, intLevel):
    if intLevel <= 5:
        pensize((5-intLevel)**2+1)
    else:
        pensize(1)
    intTravel = random.randint(int(intDist//1.5), int(intDist//.8))
    print(intTravel)
    forward(intTravel)
    if (intDist > intMin):
        intNB = random.randint(2,5)
        intMaxAng = random.randint((intNB*20), (intNB*30))
        intAvgAng = intMaxAng//(intNB-1)
        intParentAng = heading()
        left((intNB/2)*intAvgAng-(intAvgAng//2))
        for branch in range(intNB):
            intAV = random.randint(-5, 5)
            drawBranch(int(intDist//1.5), intLevel+1)
            right(intAvgAng+intAV)
        setheading(intParentAng)
    back(intTravel)

speed(0)
teleport(0,-300)
setheading(90)
drawBranch(150, 1)

screen.exitonclick()

Finished Code

from turtle import *
import random
from PIL import Image
screen = Screen()


intMin = 30

def drawLeaf(intSize):
    liColors = ["green", "limegreen", "palegreen", "greenyellow", "mediumseagreen", "yellowgreen", "seagreen"]
    color(random.choice(liColors))
    intSize += random.randint(int(intSize*.9), int(intSize*1.1))
    begin_fill()
    circle(intSize, 120)
    left(60)
    circle(intSize, 120)
    end_fill()

def drawBunch(intSize):
    intHeading = heading()
    for x in range(random.randint(3,5)):
        right(random.randint(20, 350))
        drawLeaf(intSize)
    setheading(intHeading)



def drawBranch(intDist, intLevel):
    if intLevel <= 5:
        pensize((5-intLevel)**2+1)
    else:
        pensize(1)
    intTravel = random.randint(int(intDist//1.5), int(intDist//.5))
    print(intTravel)
    color("sienna")
    forward(intTravel)
    if (intDist > intMin):
        if intLevel > 4:
            intNB = random.randint(2, 3)
        else:
            intNB = random.randint(2,(6-intLevel))
        intMaxAng = random.randint((intNB*20), (intNB*30))
        intAvgAng = intMaxAng//(intNB-1)
        intParentAng = heading()
        left((intNB/2)*intAvgAng-(intAvgAng//2))
        for branch in range(intNB):
            intAV = random.randint(-5, 5)
            drawBranch(int(intDist//1.5), intLevel+1)
            right(intAvgAng+intAV)
        setheading(intParentAng)
    else:
        drawBunch(10)

    color("sienna")
    back(intTravel)

speed(0)
teleport(0,-300)
setheading(90)
drawBranch(150, 1)

screen.exitonclick()