K103: Bewegungen an eine absolute Position

Ziel

In den letzten Lektionen haben wir unsere Schildkröte durch gezielte Anweisungen, ausgehend von ihrer aktuellen Position, einer Richtung und einer Streckenlänge, zu einer neuen Position verschoben. In diesem Themenblock wollen wir lernen, wie man alternativ die absolute Endposition der Bewegung festlegen kann.

Am Ende dieser Lektion solltest du

  • das verwendete kartesischen Koordinatensystem kennen und darin Positionen anhand eines Zahlenpaars (x,y) festlegen können.
  • wissen, wie man mittels der Anweisungen goto(xy=None), setpos(xy=None) bzw. setposition( xy=None) den Cursor an eine bestimmte Position verschieben kann.
  • wissen, wie man die Position der Schildkröte über die 2 Anweiswungen xcor() bzw. ycor() ermitteln kann.

Fortgeschrittene Kursteilnehmer vertiefen gleichzeitig die folgenden Themen:

  • setzen eines Fenstertitels und Umgang mit Zeichenketten
  • erzeugen von Zufallszahlen mittels random.randint()
  • Datentypen Tuples und Listen

Absolute oder relative Bewegungen

Wir können durch Anweisungen unsere Schildkröte bewegen. Dadurch, dass wir sie ganz gezielt bewegen, entstehen dann schöne Grafiken.

Dabei gibt es 2 unterschiedliche Möglichkeiten, wie wir die Schildkröte bewegen können. Zur Unterscheidung werden wir diese fortan als relative oder absolute Bewegungen bezeichnen. Genau genommen geht es nicht um die Bewegung selber, sondern um die Angaben zur Bewegung bzw. zu ihren Werten und um Bezugspunkte.

Relative Bewegungen bzw. Bewegungsangaben

Das System der relativen Bewegungsangaben hast du bereits kennengelernt. Hier sagen wir der Schildkröte, wie viele Grad sie sich drehen und wie viele Schritte sie, ausgehend von ihrem aktuellen Standort aus, machen soll. Wir haben hierzu Anweisungen wie left(), right(), forward() und back() genutzt.

Der springende Punkt bei diesen Anweisungen ist, dass sie sich immer auf die gerade aktuelle Position und Ausrichtung unserer Schildkröte beziehen. Die Anweisung forward(100) bewegt unsere Schildkröte, ausgehend von ihrer aktuellen Position (wo auch immer diese ist), um 100 Schritte nach vorne. Der Bezug- bzw. Referenzpunkt ist also die jeweils aktuelle Position der Schildkröte. Genau gleich dreht die Anweisung left(40) unserer Schildkröte um 40 Grad nach links, bezogen auf ihre aktuelle Ausrichtung (Blickrichtung). Der Bezug- bzw. Referenzpunkt ist also die jeweils aktuelle Ausrichtung der Schildkröte.

Das ist ein ganz allgemeines Prinzip, und funktioniert auch im Alltag so. Stelle dir vor, dass du einem Touristen den Weg zum Bahnhof erklären sollst. Du wirst ihm beispielsweise sagen, dass er 100 Schritte geradeaus gehen soll, sich dann nach links drehen muss, von dort nochmals 500 Schritte geradeaus und anschliessend nochmals nach rechts, etc. Das sind alles relative Angaben, bezogen auf die jeweilige Position und Blickrichtung des Toursiten.

Bei relativen Angaben können wir, ausgehend von jeder beliebigen Stelle und Blickrichtung unserer Schildkröte, jede beliebige andere Stelle auf dem Bildschirm erreichen. Alles was wir dazu benötigen, ist eine Drehung um einen zu bestimmenden Winkel und eine gerade Bewegung um eine zu bestimmende Distanz.

Ausgehend vom grünen Punkt (hier beim Ursprung) können wir den roten Punkt erreichen, indem wir zuerst unsere Schildkröte um 120 Grad nach links drehen und anschliessend 150 Schritte vorwärts fahren. Ausgehend vom blauen Punkt können wir den roten Punkt erreichen, indem wir zuerst unsere Schildkröte um 135 Grad nach links drehen und anschliessend 90 Schritte vorwärts fahren.

Absolute Bewegungen bzw. Bewegungsangaben

Bei absoluten Angaben sagen wir ihr unserer Schildkröte, wohin sie gehen soll. Das ist ebenfalls ein ganz allgemeines Prinzip, welches Du aus dem Alltag kennst. Du kannst beispielsweise dem Touristen sagen, dass sich der Bahnhof im Quadranten H4 auf dem Stadtplan befindet. Oder einer Person, welche das Personalbüro sucht, dass sich dieses im 3. Obergeschoss befindet.

Bei absoluten Bewegungsangaben nutzten wir einen anderen Referenzpunkt. Wir beziehen uns immer auf den Ursprung (und eine ursprüngliche Ausrichtung). Wir werden dies gleich an einigen Beispielen verdeutlichen. Vorab werfen wir aber einen Blick auf das Koordinatensystem.

Kartesisches Koordinatensystem

Damit wir mit absoluten Bewegungsangaben arbeiten können, benötigen wir ein Koordinatensystem bzw. einen absoluten Referenzpunkt. Um die Bewegungen oder besser noch die Positionen unserer Schildkröte auf dem Bildschirm zu verstehen, müssen wir uns deshalb kurz mit dem in Turtle Graphics verwendeten Koordinatensystems beschäftigen.

Es handelt sich dabei, wie zu erwarten, um das kartesische Koordinatensystem. Zu erwarten deshalb, weil das kartesische Koordinatensystem das allgemein gebräuchliche und wohl am meisten verbreitete Koordinatensystem ist, welches der eine oder andere sicherlich aus der Schule kennt.

Das Koordinatensystem hat einige Besonderheiten, zu welchen gehört:

  • Es gibt 2 Achsen, sogenannte Koordinatenachsen. Eine horizontale (waagrecht, von links nach rechts) und eine vertikale (senkrecht, von oben nach unten). Die horizontale Achse nennt man x-Achse (Abszisse) und die vertikale Achse nennt man y-Achse (Ordinate)
  • Die zwei Achsen stehen genau senkrecht (orthogonal) zueinander. D.h. zwischen den Achsen ist ein Winkel von 90 Grad.
  • Die 2 Achsen haben eine Skala, mit Nummern in gleichen Abständen.
  • Über diese 2 Skalen lässt sich jede Position auf dem Feld über ein Zahlenpaar beschreiben. Gibt man eine Position an, so nennt man übrigens immer zuerst die Ausprägung auf der x-Achse und anschliessen jene der Y-Achse.
  • Dort wo sich die 2 Achsen schneiden, ist der Ursprung (auch: Nullpunkt). Der Ursprung hat die Koordinaten (0, 0).

Das Ganze klingt etwas komplizierter, als es in der Tat ist. Zur Illustration sind in der oben dargestellten Grafik 4 schwarze Schildkröten eingezeichnet (Dreiecke mit nebenstehenden Nummern 1-4). Sie haben folgende Koordinaten:

  • Turtle 1: (4, 6)
  • Turtle 2: (8, 2)
  • Turtle 3: (-5, 2)
  • Turtle 4: (-4, -3)

Um zur Turtle 1 zu gelangen, gehst du also vom Ursprung aus 4 Felder nach rechts (x-Achse) und dann 6 Felder nach oben (y-Achse).

Beachte: Die kartesischen Koordinaten (die 2 Zahlen) sagen nur etwas über die Position der Schildkröte auf dem Bildschirm aus, nicht aber über ihre Ausrichtung. Damit man weiss, in welche Richtung die Schildkröte schaut, braucht man noch eine weitere Angabe. Doch mehr dazu später.


Löse nun die Aufgaben 1 und 2.


Absolute Bewegungen mit der Schildkröte

Wir haben in den vorangehenden Lektionen bereits die Anweisungen gesehen, um unsere Schildkröte mit relativen Angaben zu bewegen. Namentlich die zwei Bewegungsanweisungen forward() und back(). forward(100) beispielsweise bewegt die Turtle in Blickrichtung um 100 Schritte geradeaus.

Nun werfen wir einen Blick auf Bewegungsanweisungen mit absoluten Positionsangaben. Wir können unsere Schildkröte nämlich dazu bringen, sich zu einer beliebigen Position (Koordinate) auf dem Bildschirm zu bewegen. Hierzu benötigen wir die Funktion goto() zusammen mit einer x, y Koordinate, zu welcher die Turtle gehen soll. Zum Beispiel so:

from turtle import *

goto(100,0)
goto(100,150)
goto(-30,100)

exitonclick()

Das Programm führt zur nachfolgend dargestellten Ausgabe auf dem Bildschirm.

Hierzu einige Anmerkungen:

  • Ausgegeben wird nur der schwarze Strich. Zur Hilfe wurden in der Grafik nachträglich noch der Ursprung (in roter Farbe) und die x-Achse sowie die y-Achse (jeweils in grauer Farbe) eingezeichnet.
  • Der Ursprung (Nullpunkt) liegt bei Turtle Graphics genau in der Mitte des Fensters.
  • Die Skala ist natürlich viel «feiner» wie in den eingangs dargestellten Koordinatenkreuzen. Soll heissen, dass die Werte auf den Achsen nicht nur von -10 bis + 10 gehen, sondern beispielsweise von -500 bis +500
  • Wir können die Position des Ursprungs, die Skala und auch die Bildschirmgrösse in Turtle Graphics ändern. Doch mehr dazu später.

Die Anweisung goto(x,y(von engl. go: gehe und engl. to: nach) bewegt den Cursor an die angegebene Stelle im Koordinatensystem. Die Anweisung hat die folgende Syntax:

turtle.goto(xy=None)

Verlangt werden zwei Parametern namentlich eine Angabe zum x-Wert (Position bzw. Ausprägung auf der x-Achse) und eine Angabe zum y-Wert (Position bzw. Ausprägung auf der y-Achse). Die Anweisung goto(100,150) bewegt die Schildkröte somit an die Koordinate x= 100, y=150.

Die Orientierung der Turtle wird durch die Bewegung der Turtle nicht geändert. Im oben dargestellten Bild zum Beispielprogramm sieht man gut, dass unsere Schildkröte auch am Ende noch immer ihre ursprüngliche Orientierung nach rechts (nach Osten) hat.

Anstelle von goto(x,y) kann man auch setpos(x,y) oder setposition(x,y) schreiben. Der Befehl macht genau dasselbe und entsprechend ist auch die Syntax identisch:

turtle.setpos(xy=None)
turtle.setposition(xy=None)


Löse nun die Aufgaben 3a, 3b und 4a (Allgemein)

Weitergehende, ergänzende Aufgaben (Variablen und Zufallszahlen):
Aufgabe 3c, 3d, und 4c


Hinweis für Fortgeschrittene: Arbeiten mit Tuple

Die in der Syntax verwendete Notation (x, y=None) bedeutet, dass man entweder 2 oder alternativ nur einen Wert (hier ist dann y=None) angeben kann.

  • 2 Werte bedeutet die Angabe jeweils einer Zahl zur x-Ausprägung und einer Zahl zur y-Ausprägung. Beispielsweise so: goto(40,60)
  • 1 Wert bedeutet hier die Angabe eines Wertepaars. In der Fachsprache ist dies dann ein Tupel bestehend aus 2 Zahlen.

Zur Verdeutlichung der nachfolgende Code:

stelle = (100, 40)
goto(stelle)

Tupel ist die Bezeichnung für einen bestimmten Datentyp, welcher aus mehreren Elementen besteht. Tupel werden in Python mit runden Klammern () definiert. Beachte, dass in der Anweisung goto(stelle) im Unterschied zu goto(x, y) nur eine Variable/ ein Platzhalter innerhalb der Klammer steht. Diese Variable besteht aber ihrerseits aus 2 Elementen. Bei der Anweisung goto(100, 40) stehen demgegenüber zwei Variablen vom Typ int in der Klammer.

Alternativ kann man übrigens auch eine Liste mit 2 Werten übergeben. Beispielsweise so: goto([40,60]). Listen werden in Python mit eckigen Klammern [] definiert.


Zur Illustration siehe Aufgaben 3e und 4e


Bei Objekten des Datentyps Tuple gibt es einige Besonderheiten. Dazu zählen:

  1. Tuple sind unveränderlich
  2. + Operation führt zu Verknüpfung (Concatenate)
  3. Zugriff auf Elemente ist über Index möglich.

zu 1):
Einmal angelegt ist ein Tuple unveränderlich (im Unterschied zu Listen). Du kannst ein Tuple aber «überschreiben» (Python verweist dann mit dem Namen auf ein neues Objekt, was man an der ID des Objekts sieht)

zu 2):
Da Tuple unveränderlich sind, kannst du nicht einfach Werte zu einem Tuple hinzuaddieren. Beim + Operator bildet Python ein neues Tuple und hängt die zusätzlichen Elemente hinten an. Eine intuitiv naheliegende einfache Vektoraddition ist somit nicht (ohne weiteres) möglich.

zu 3):
Über den Index kann man auf die einzelnen Elemente eines Tuples zugreifen. Der Index ist eine Zahl und wird in [] Klammern notiert. Er beginnt bei 0! D.h. das erste Element hat den Index 0, das zweite Element den Index 1, das dritte Element den Index 2 etc.


Zur Illustration siehe Aufgabe 4f


Exkurs: Bewegung in nur einer Koordinatenrichtung

Es gibt in Turtle Graphics noch zwei Sonderformen der Verschiebung unserer Schildkröte hin zu absoluten Koordinaten. Wir können nur die x-Position oder alternativ nur die y-Position verschieben. Hierzu nutzen wir die Anweisungen setx(x) bzw. sety(y). Die Anweisungen haben die folgende Syntax:

turtle.setx(x)
turtle.sety(y)

Ausgehend von einer Position (100, 50) verschiebt die Anweisung setx(200) die Turtle nach (200, 50). Und ausgehend von (100, 50) verschiebt die Anweisung sety(200) unser Turtle nach (100, 200).

Als Wertangabe kann man entweder eine Ganzzahl oder eine Kommazahl angeben. Möglich sind natürlich wiederum auch negative Zahlen.

Auslesen der Position

Manchmal muss man wissen, wo sich unsere Schildkröte gerade befindet. Über die Anweisungen xcor() und ycor() kann man die aktuelle Position der Schildkröte ermitteln.

turtle.xcor()
turtle.ycor()


In Aufgabe 4d findest du ein Beispiel


Hinweis für Fortgeschrittene:

Über die Anweisung position() oder gleichbedeutend pos() kann man die Position der Schildkröte ebenfalls ermitteln. Beim Aufruf der Funktion position() oder pos() gibt Python die Position als Wertepaar zurück. Es ist ein Tuple.

turtle.position()
turtle.pos()

Übungsaufgaben

Nachfolgend findest Du ein paar Übungsaufgaben.


Aufgabe 1: Koordinaten lesen

Bezeichne die Koordinaten unserer Schildkröte (Dreieck) im nachfolgenden Koordinatensystem.

Aufgabe 2: Koordinaten einzeichnen

Nimm ein Blatt Papier. Zeichne ein Koordinatensystem ein. Der Ursprung liegt in der Mitte des Papiers. Die x-Achse soll von -7 bis +7 gehen, die y-Achse von 5 bis -5.

Trage nun die folgenden Positionen ein:

  • Position 1: (3, -3)
  • Position 2: (-6, 0)
  • Position 3: (4, 2)
  • Position 4: (-4, -2)

Aufgabe 3a: Mein Haus

Zeichne das nachfolgend dargestellte Haus mittels der goto() Anweisung.

Hinweis: Du kannst alternativ auch die setpos() oder setposition() Anweisung verwenden.

Aufgabe 3b: Mein anderes Haus

Zeichne das nachfolgend dargestellte Haus mittels der goto() Anweisung. Die Höhe des Dachs beträgt 40 Punkte.

Hinweis: Du kannst alternativ wiederum die setpos() oder setposition() Anweisung verwenden.

Aufgabe 3c: Mein flexibles Haus

Zeichne ein Haus. Am Anfang des Programms definierst du die Parameter anzahl_stockwerke und breite. Ebenso die Koordinaten x0 und y0 der linken unteren Hausecke.

Es gilt:

  • Das Haus ist so breit wie in der Variable breite angegeben.
  • Die Höhe (ohne Dach) hängt von der Anzahl Stockwerken (Variable anzahl_stockwerke) ab. Jedes Stockwerk ist genau 50 Punkte hoch.
  • Das Dach ist immer 40 Punkte hoch.

Aufgabe 3d: Mein zufälliges Haus

Zeichne nun ein zufälliges Haus. Nutze hierfür die Anweisung random.randint(von, bis) aus der Bibliothek random.

Es gilt:

  • Das Haus ist zwischen 50 und 200 Punkten breit.
  • Die Höhe (ohne Dach) hängt von der Anzahl Stockwerken ab. Das Haus hat zwischen 1-5 Stockwerke. Jedes Stockwerk ist immer genau 50 Punkte hoch.
  • Das Dach ist wiederum immer 40 Punkte hoch.

Zusatz:

  • Platziere das Haus so, dass die Mitte des Hauses (ohne Dach) gerade beim Ursprung liegt.
  • Passe noch den Titel an, so dass Breite und Höhe im Titel stehen. Also Beispielsweise «Mein Haus 240 x 200».

Aufgabe 3e: Mein Haus mit Tupel

Basis bildet nochmals das Haus aus Aufgabe 3a. Zeichne dieses wiederum mit der goto() Anweisung. Anstelle von jeweils 2 Koordinaten übergibst du diesmal jedoch jeweils ein Tupel.

Aufgabe 4a: Mein Viereck

Zeichne das nachfolgend abgebildete Viereck:

Ergänze hierzu den Code:

from turtle import *

# Titel des Fensters
title("Ein Viereck")

# Farben
pencolor("blue")
pensize(2)

# Koordinaten
x0 = -100
y0 = 40
x1 = -10
y1 = 80
x2 = 100
y2 = -140
x3 = 0
y3 = -120

penup()
goto(x0,y0)
pendown()

# gehe zur Ecke 1
# gehe zur Ecke 2
# gehe zur Ecke 3
# gehe zurück zur Ecke 0

penup()
home()

# Abschluss
exitonclick()

Die Ecke 0 hat die Koordinaten (x0, y0), Ecke 1 hat (x1, y1), etc.

Aufgabe 4c: Mein Viereck dx, dy

Zeichne das nachfolgend abgebildete Viereck:

Es gilt:

  • Die erste Ecke ist frei wählbar. Im Beispiel (-100,40).
  • Ausgehend von dieser Ecke siehst Du in der oben dargestellten Skizze die Differenzen entlang der x-Achse (dx) und y-Achse eingetragen.

Zusatz:
Passe noch den Titel des Fensters an. Beispielsweise «Mein Viereck».

Aufgabe 4d: Mein zufälliges Viereck

Basis bildet das Viereck aus Aufgabe 4. Neu drehst du am Anfang des Programms die Schildkröte zufällig in eine Richtung und gehst mit ihr ebenfalls zufällig zwischen 50 und 100 Schritte geradeaus. Dies ist die neue linke obere Ecke.

Ermittle die Koordinaten der linken oberen Ecke und Zeichne ausgehend davon das Viereck.

Zusatz:
Passe noch den Titel des Fensters an. Beispielsweise «Mein zufälliges Viereck».

Aufgabe 4e: Mein Viereck mit Tuple

Zeichne nochmals das Viereck aus Aufgabe 4a. Schreibe nun das Programm aber so um, dass die Koordinatenpaare jeweils in Tuple zusammengefasst sind.

Aufgabe 4f: Mein Viereck mit Tuple – Addition

Zeichne nochmals das Viereck aus Aufgabe 4c. Schreibe nun das Programm aber so um, dass die Koordinatenpaare und Additionen jeweils in Tuple zusammengefasst sind.

Comments