Programming Pandit

c/c++/c#/Javav/Python


Latest Update

Thursday, September 10, 2020

Forest Design Python programming Demo by G Krishna Chauhan

Source Code


#!/usr/bin/env python3

"""     turtlegraphics-example-suite:


             tdemo_forest.py


Displays a 'forest' of 3 breadth-first-trees

similar to the one in tree.

For further remarks see tree.py


This example is a 'breadth-first'-rewrite of

a Logo program written by Erich Neuwirth. See

http://homepage.univie.ac.at/erich.neuwirth/

"""

from turtle import Turtle, colormode, tracer, mainloop

from random import randrange

from time import perf_counter as clock


def symRandom(n):

    return randrange(-n,n+1)


def randomize( branchlist, angledist, sizedist ):

    return [ (angle+symRandom(angledist),

              sizefactor*1.01**symRandom(sizedist))

                     for angle, sizefactor in branchlist ]


def randomfd( t, distance, parts, angledist ):

    for i in range(parts):

        t.left(symRandom(angledist))

        t.forward( (1.0 * distance)/parts )


def tree(tlist, size, level, widthfactor, branchlists, angledist=10, sizedist=5):

    # benutzt Liste von turtles und Liste von Zweiglisten,

    # fuer jede turtle eine!

    if level > 0:

        lst = []

        brs = []

        for t, branchlist in list(zip(tlist,branchlists)):

            t.pensize( size * widthfactor )

            t.pencolor( 255 - (180 - 11 * level + symRandom(15)),

                        180 - 11 * level + symRandom(15),

                        0 )

            t.pendown()

            randomfd(t, size, level, angledist )

            yield 1

            for angle, sizefactor in branchlist:

                t.left(angle)

                lst.append(t.clone())

                brs.append(randomize(branchlist, angledist, sizedist))

                t.right(angle)

        for x in tree(lst, size*sizefactor, level-1, widthfactor, brs,

                      angledist, sizedist):

            yield None



def start(t,x,y):

    colormode(255)

    t.reset()

    t.speed(0)

    t.hideturtle()

    t.left(90)

    t.penup()

    t.setpos(x,y)

    t.pendown()


def doit1(level, pen):

    pen.hideturtle()

    start(pen, 20, -208)

    t = tree( [pen], 80, level, 0.1, [[ (45,0.69), (0,0.65), (-45,0.71) ]] )

    return t


def doit2(level, pen):

    pen.hideturtle()

    start(pen, -135, -130)

    t = tree( [pen], 120, level, 0.1, [[ (45,0.69), (-45,0.71) ]] )

    return t


def doit3(level, pen):

    pen.hideturtle()

    start(pen, 190, -90)

    t = tree( [pen], 100, level, 0.1, [[ (45,0.7), (0,0.72), (-45,0.65) ]] )

    return t


# Hier 3 Baumgeneratoren:

def main():

    p = Turtle()

    p.ht()

    tracer(75,0)

    u = doit1(6, Turtle(undobuffersize=1))

    s = doit2(7, Turtle(undobuffersize=1))

    t = doit3(5, Turtle(undobuffersize=1))

    a = clock()

    while True:

        done = 0

        for b in u,s,t:

            try:

                b.__next__()

            except:

                done += 1

        if done == 3:

            break


    tracer(1,10)

    b = clock()

    return "runtime: %.2f sec." % (b-a)


if __name__ == '__main__':

    main()

    mainloop()





No comments:

Post a Comment