Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1415:projekte_im_wintersemester_2014_15:midpoint_displacement_algorithm

Midpoint Displacement Algorithm

Wir wollten eine Silhouette einer Berglandschaft mit der Turtlegrafik zeichnen. Zwei Ansätze wurden zugunsten des objektorientierten Ansatzes verworfen.

#cc by Max
import turtle
from numpy import random as rd
 
 
class dot(object):
    '''
    Argumente: x - Eine x-Koordinate des Typs Integer.
               y - Eine y-Koordinate des Typs Integer.
    Eine Klasse die einen Punkt darstellt.
    Besitzt einen x- und einen y- Wert.
    '''
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
    def divide(self, n):
        '''
        Argumente: n - Eine beliebige ganze Zahl.
        Teilt den Vektor des Punktes durch eine ganzzahlige Zahl n.
        Und gibt den neuen Vektor zurueck. Dieser Punkt wird nicht
        '''
        return dot(self.x//n, self.y//n)
 
    def add(self, dot1):
        '''
        Argumente: dot1 - Ein beliebiger Punkt der Klasse "dot"
        Addiert einen anderen Punkt. Addition erfolgt wie bei Vektoren.
        Gibt die Summe zurueck. Dieser Punkt wird nicht veraendert.
        '''
        return dot(dot1.x+self.x, dot1.y+self.y)
 
    def draw(self):
        '''
        Zeichnet einen Punkt an den Koordinaten des Punktes mithilfe
        des "turtle" Paketes. Benoetigt das turtle Paket.
        '''
        turtle.penup()
        turtle.goto(self.x, self.y)
        turtle.pendown()
        turtle.dot()
 
    def drawline(self):
        '''
        Zeichnet einen Punkt von der momentanen Position der turtle
        zu den Koordinaten des Punktes. Benoetigt das turtle Paket.
        '''
        turtle.pendown()
        turtle.goto(self.x, self.y)
 
 
def rlines(dot1, dot2, height=400, depth=8):
    '''
    Argumente: dot1 - Linker Punkt der Kurve
               dot2 - Rechter Punkt der Kurve
               height - maximale Hoehe der Punkte
               depth - Rekursionstiefe
    Bestimmt rekursiv zufaellig abweichende
    Punkte entlang einer Kurve zwischen
    zwei Punkten und gibt diese in einer Liste zurueck.
    Alle Punkte sind Objekte der "dot" Klasse.
    TODO:    Anpassen der Parameter um besser aussehende
             Ergebnisse zu erzielen.
    '''
    if depth > 0:
        a = rd.randint(low=-height/10, high=height)
        centerdot = dot1.add(dot2).divide(2)
        centerdot.y += a
        leftdots = rlines(dot1, centerdot, height//2, depth-1)
        rightdots = rlines(centerdot, dot2, height//2, depth-1)
        return leftdots + [centerdot] + rightdots
    else:
        return []
 
 
dot1 = dot(-500, -200)
dot2 = dot(500, -200)
 
a = [dot1] + rlines(dot1, dot2) + [dot2]
turtle.penup()
turtle.goto(dot1.x, dot1.y)
for i in a:
    i.drawline()

Eines der Ergebnisse des Algorithmus

bergprozeduralmax.jpg

ws1415/projekte_im_wintersemester_2014_15/midpoint_displacement_algorithm.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)