Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
lehrkraefte:blc:informatik:ffprg1-2019:oop-intro [2019/04/02 09:33] Ivo Blöchliger [Klasse, Instanz, Referenz] |
lehrkraefte:blc:informatik:ffprg1-2019:oop-intro [2019/04/02 10:51] Ivo Blöchliger [L-Systems] |
||
---|---|---|---|
Line 67: | Line 67: | ||
move(self.x, | move(self.x, | ||
| | ||
- | def move(self, draw=True): | + | def forward(self, draw=True): |
- | self.x+=self.l*math.cos(self.a) | + | self.x += self.l * math.cos(self.a) |
- | self.y+=self.l*math.sin(self.a) | + | self.y += self.l * math.sin(self.a) |
if draw: | if draw: | ||
lineTo(self.x, | lineTo(self.x, | ||
else: | else: | ||
- | | + | |
| | ||
| | ||
Line 85: | Line 85: | ||
t = Myturtle() | t = Myturtle() | ||
for i in range(5): | for i in range(5): | ||
- | t.move() | + | t.forward() |
t.turn(72) | t.turn(72) | ||
| | ||
</ | </ | ||
+ | ===== Zugriff auf Instanzvariablen ===== | ||
+ | Die Turtle-Klasse hat zur Zeit 4 Instanzvariablen: | ||
+ | t.x=-5 | ||
+ | wird die $x$-Koordinate auf $-5$ gesetzt. Das ist aber nicht unbedingt eine gute Praxis. In vielen Fällen schreibt man Methoden, um die Variablen zu setzen und auszulesen. Das hat den Vorteil, dass die Werte überprüft werden können und dass der Zeichenstift auch dorthin bewegt werden kann. Z.B. wie folgt: | ||
+ | |||
+ | <code python> | ||
+ | def setX(self, x, constrain=True): | ||
+ | if constrain: | ||
+ | if x< | ||
+ | x = toWindowX(0) | ||
+ | if x> | ||
+ | x = toWindowX(getWindow().width) | ||
+ | self.x = x | ||
+ | move(self.x, | ||
+ | </ | ||
+ | |||
+ | ====== L-Systems ====== | ||
+ | Wir werden jetzt selbst eine ganz einfache Programmiersprache definieren, um die Turtle zu steuern. Die Sprache besteht aus einzelnen Buchstaben, deren Bedeutung wie folgt ist: | ||
+ | * **F** mache einen Schritt vorwärts. | ||
+ | * **+** drehe im Gegenuhrzeigersinn. | ||
+ | * **-** drehe im Uhrzeigersinn. | ||
+ | |||
+ | Wir programmieren eine Methode, die einen String als Parameter entgegennimmt und die Turtle entsprechend steuert: | ||
+ | <code python> | ||
+ | def lsyst(self, code): | ||
+ | for c in code: # Alle Buchstaben durchgehen | ||
+ | # | ||
+ | # Tu was, je nachdem was c ist | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Rekursion ===== | ||
+ | Wir werden jetzt den Befehl **F** jeweils durch den ganzen Code ersetzen (bis zu einer gewissen Tiefe), und so eine Figur zeichnen. Dazu wählen wir einen zusätzlichen Parameter **tiefe**, der angibt, wie viele Male noch ersetzt werden muss. | ||
+ | |||
+ | <code python> | ||
+ | if c==" | ||
+ | if (tiefe==0): | ||
+ | self.forward() | ||
+ | else: | ||
+ | self.lsyst(code, | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | * **(** speichere die aktuellen Parameter (Positition, | ||
+ | * **)** stelle die zuletzt gespeicherten Parameter wieder her | ||