import turtle, random

def main():
    b_len = 180
    b_angle = 22
    
    DiS_tree(b_len, b_angle)

    #saving file
    screen = turtle.getscreen()
    screen.getcanvas().postscript(file="DiStree.eps")
    
def DiS_tree(b_len, b_angle):
    leo = DiS_turtle()
    DiS_tree_branch(leo, b_len, b_angle)

    
def DiS_tree_branch(leo, b_len, b_angle):
    '''
    Dette er en rekursiv funktion, der tegner én gren på¨et træ, hvorefter den kalder sig selv og tegner endnu en gren, osv. Funktionen viurker på denne måde:
    1. Først tegnes en gren/stamme med længden b_len
    2. For enden af denne gren drejes b_angle mod højre, og en ny gren tegnes ved at kalde denne funktion igen (og herved startes en rekursion)
    3. Når skildpadden ikke kan komme længere mod højre (fordi grenen nu er mindre end 10 pixels), så drejer den b_angle til venstre
    (den laver en "y" forgrening) og kalder sig selv igen for at starte ny forgrening i denne retning (endnu en rekursion startes)
    4. Når både højre og venstre side af en forgrening er færdig "backtracker" skildpadden et trin fra der hvor forgreningen startede i den indeværende funktionskald
    '''

    if b_len > 10:
        leo.pencolor(DiS_branch_color(leo)) #grenen ændrer løbende farve
        leo.pensize(b_len*0.1) #grenen bliver løbende mindre

        # trin 1 - der tegnes en gren
        leo.forward(b_len)

        # trin 2 - en forgrening startes mod højre
        leo.right(b_angle)
        DiS_tree_branch(leo, (b_len*0.75), b_angle)

        #trin 3 - en forgrening startes mod venstre (vinklen fordobles fordi vi allerede er b_angle drejet mod højre)
        leo.left((2*b_angle))
        DiS_tree_branch(leo, (b_len*0.75), b_angle)

        #trin 4 - når både højre og venstre forgrening er færdig, trædes et skridt tilbage på stammen uden at tegne
        leo.right(b_angle)
        leo.up()
        leo.backward(b_len)
        leo.down()

def DiS_turtle():
    turtle.colormode(255)
    leonardo = turtle.Turtle()
    leonardo.hideturtle()
    leonardo.shape("turtle")
    leonardo.pencolor(50,50,50)
    leonardo.speed(0)
    leonardo.left(90)

    leonardo.up()
    leonardo.setpos(0,(-1*0.4*turtle.window_height())) #moving turtle to (almost) the bottom of screen
    leonardo.down()
    leonardo.showturtle()
    
    return leonardo
    

def DiS_branch_color(leo):
    '''
    Returnerer en (r,g,b) tupple med en farveforskydning af leo-skildpadens eksisterende farve
    '''
    color = leo.color()
    r = int(color[0][0])
    rr = random.randint(r-50,r+50)
    if rr > 255 or rr < 0:rr = r
    
    g = int(color[0][1])
    gr = random.randint(g-50,g+50)
    if gr > 255 or gr < 0: gr = g
    
    b = int(color[0][2])
    br = random.randint(b-50,b+50)
    if br > 255 or br < 0: br = b
    
    return (rr,br,gr)




main()




