Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1415:projekte_im_wintersemester_2014_15:midpoint_displacement_algorithm

Dies ist eine alte Version des Dokuments!


Midpoint Displacement Algorithm

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

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()
ws1415/projekte_im_wintersemester_2014_15/midpoint_displacement_algorithm.1417106547.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)