====== 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}}