from math import sin, cos, pi from random import randrange def svg_linie_als_string(x1, y1, x2, y2, farbe, dicke): return f'' class zeichenfenster(): def __init__(self, breite, hoehe): self.breite = breite self.hoehe = hoehe self.liste_strecken = [] def strecke(self, x1, y1, x2, y2, farbe, dicke=1): self.liste_strecken.append((x1, y1, x2, y2, farbe, dicke)) def speichere_als_svg(self, name): with open(name, 'w') as datei: datei.write(f'\n') datei.write(f'\n') for s in self.liste_strecken: datei.write(svg_linie_als_string(*s)+'\n') datei.write('\n') ############################################## # Diverse Funktionen zur Steuerung der Kröte # ############################################## def vorwaerts(distanz): global x, y, alpha vx = distanz*cos(alpha*pi/180) vy = distanz*sin(alpha*pi/180) if stiftunten: fenster.strecke(x, y, x+vx, y+vy, farbe, dicke) x += vx y += vy def rueckwaerts(distanz): vorwaerts(-distanz) def links(winkel): global alpha alpha -= winkel def rechts(winkel): links(-winkel) def stifthoch(): global stiftunten stiftunten = False def stiftrunter(): global stiftunten stiftunten = True def setze_farbe(f): global farbe farbe = f def setze_dicke(d): global dicke dicke = d def baum(tiefe, laenge): setze_farbe((randrange(256), randrange(256), randrange(256))) vorwaerts(laenge) if tiefe > 0: links(30) baum(tiefe-1, laenge/2) rechts(60) baum(tiefe-1, laenge/2) links(30) stifthoch() rueckwaerts(laenge) stiftrunter() ############################# # Beginn des Hauptprogramms # ############################# fenster = zeichenfenster(5000, 5000) ############################################################ # Zustandsdaten der Kröte in separaten Variablen speichern # ############################################################ kroete = {} x = 2500 y = 5000 alpha = -90 farbe = (255, 0, 0) dicke = 1 stiftunten = True setze_dicke(10) baum(9, 2000) fenster.speichere_als_svg("output.svg")