Turtleizer
Die Turtleizer-Komponente ermöglicht es, eine kleine grüne Schildkröte über eine Zeichenfläche zu bewegen und sie etwas zeichnen zu lassen. Zu Beginn der Ausführung ist der Hintergrund weiß, die Standard-Stiftfarbe ist schwarz, der Stift ist abgesetzt, die Schildkröte ist sichtbar und in der Mitte der Turtleizer-Zeichenfläche platziert (Standardgröße ca. 500 × 500 Pixel).
API
Die folgenden Anweisungen stehen zur Verfügung (die Typbezeichner int und double geben lediglich an, welcher Zahlentyp für die Argumente erwartet oder in diesen umgewandelt wird – die Typbezeichner selbst sind nicht in die Anweisungen einzutragen):
forward(double nPixels)fd(int nPixels) |
Bewegt die Schildkröte nPixels Pixel vorwärts und zeichnet dabei eine Linie, wenn der Stift abgesetzt ist. (fd ist eine Version mit geringerer Genauigkeit, siehe Hinweise unten.) |
backward(double nPixels)bk(int nPixels) |
Bewegt die Schildkröte nPixels Pixel rückwärts und zeichnet dabei eine Linie, wenn der Stift abgesetzt ist. (bk ist eine Version mit geringerer Genauigkeit, siehe Hinweise unten.) |
right(double angle)rr(double angle) |
Dreht die Schildkröte um den angegebenen Winkel nach rechts (in Grad). |
left(double angle)rl(double angle) |
Dreht die Schildkröte um den angegebenen Winkel nach links (in Grad). |
gotoXY(int X, int Y)gotoX(int X)gotoY(int Y) |
Setzt die Schildkröte auf Position (X, Y). Setzt die X-Koordinate der Schildkrötenposition auf einen neuen Wert. Setzt die Y-Koordinate der Schildkrötenposition auf einen neuen Wert. |
penUp() |
Hebt den Stift an – beim Bewegen wird keine Linie gezeichnet. |
penDown() |
Setzt den Stift ab – beim Bewegen wird eine Linie gezeichnet. |
hideTurtle() |
Blendet die Schildkröte aus. |
showTurtle() |
Zeigt die Schildkröte wieder an. |
setPenColor(int red, int green, int blue) |
Setzt die Standard-Stiftfarbe auf den angegebenen RGB-Wert (Bereich 0…255 pro Argument). Diese Farbe wird von nicht eingefärbten Bewegungsbefehlen verwendet. |
setBackground(int red, int green, int blue) |
Setzt die Hintergrundfarbe auf den angegebenen RGB-Wert (Bereich 0…255 pro Argument). |
clear() |
Löscht alle Spuren der Schildkröte von der Zeichenfläche (ohne ihren sonstigen Status zu ändern; nur in Versionen > 3.28-06). |
Drei Funktionen stehen zur Verfügung, um die aktuelle Position und Ausrichtung der Schildkröte abzufragen (seit Release 3.27):
double getX() |
Gibt die aktuelle horizontale Position zurück (kann zwischen Pixeln liegen). |
double getY() |
Gibt die aktuelle vertikale Position zurück (kann zwischen Pixeln liegen). |
double getOrientation() |
Gibt die aktuelle Ausrichtung der Schildkröte in Grad zurück (Bereich -180…180). |
Ab Version 3.27-05 haben Sie die Möglichkeit, die Turtleizer-Routinen unter individuell konfigurierbaren Aliasnamen anzusprechen. Sie können Ihre bevorzugten Aliasnamen über das Menü Preferences › Controller Aliases ... angeben und aktivieren.
Bitte beachten Sie:
-
Prozeduren
fdundbksind keine exakten Synonyme fürforwardbzw.backward. Sie basieren auf einem ganzzahligen Pixelmodell, das auf den ersten Blick sinnvoll erscheint, aber weniger präzise ist als das interne Gleitkomma-Koordinatenmodell, das vonforwardundbackwardverwendet wird. Ein Weg zur nächsten benachbarten Pixelposition in diagonaler Richtung hat beispielsweise keine Länge von 1 Pixel, sondern √2.forwardundbackwarderhalten die resultierende Gleitkomma-Koordinate, währendfdundbkdie Schildkrötenposition auf die nächste ganzzahlige Pixelposition zwingen. Nur achsenparallele Bewegungen haben exakt ganzzahlige Längen. Bei aufeinanderfolgenden Bewegungen können sich Rundungsunterschiede von <1 Pixel bei komplexen Zeichnungen zu erheblichen Abweichungen summieren. Mit dem Gleitkommamodell ist die virtuelle Position zwar nicht zwingend auf einem exakten Pixel, aber konsistent mit den vorherigen Bewegungsrichtungen und -längen. Über die Menüpunkte Edit › To fine graphics und Edit › To integer graphics können ausgewählte Teile des Diagrammcodes von einem Paradigma ins andere und zurück konvertiert werden. Beachten Sie: Jeder Aufruf vonfd,bkoder einer dergoto*-Prozeduren zwingt die jeweilige Zielposition auf eine ganzzahlige Pixelkoordinate, die auch als Ausgangspunkt für nachfolgende Gleitkommabewegungen gilt. -
Die Standard-Stiftfarbe für
forward/backward/fd/bk-Befehle ist Schwarz. Soll die Schildkröte ein farbiges Liniensegment zeichnen, färben Sie das entsprechende Element im Diagramm ein. Alternativ können Sie die Standard-Stiftfarbe mitsetPenColor(r, g, b)ändern. Um eine weiße Linie (z. B. auf dunklem Hintergrund) zu zeichnen, können Sie kein weißes (ungefärbtes) Anweisungselement verwenden; setzen Sie stattdessen vorher die Standard-Stiftfarbe:setPenColor(255,255,255). -
Negative Werte für Pixelanzahl und Winkel sind erlaubt und entsprechen dem positiven Wert im inversen Prozeduraufruf:
right(-angle) = left(angle),forward(-nPixels) = backward(nPixels)und umgekehrt. Negative Argumentwerte insetPenColorodersetBackgroundwerden durch ihren Betrag ersetzt. - Weggelassene Argumente werden als 0 interpretiert.
- Die Aufrufe der oben aufgeführten eingebauten Prozeduren müssen in gewöhnlichen Instruction-Elementen, nicht in Call-Elementen platziert werden.
-
Die goto-Prozeduren (
gotoX,gotoY,gotoXY) zeichnen niemals etwas – unabhängig davon, ob der Stift oben oder unten ist. Der Koordinatenursprung der Zeichenfläche befindet sich in der oberen linken Ecke, Y-Koordinaten wachsen nach unten. -
Die durch
setBackgroundgesetzte Hintergrundfarbe bleibt bis zum nächstensetBackground-Aufruf erhalten, jedoch setzt ein neues Diagramm im Debugger die Hintergrundfarbe auf Standardweiß zurück. -
Der von
getOrientation()zurückgegebene Winkel ist 0, wenn die Schildkröte nach oben (Norden) schaut, positiv bei Blick nach rechts (Uhrzeigersinn) und negativ bei Blick nach links (Gegenuhrzeigersinn).
Um einen Algorithmus mit Turtleizer-Prozeduren ausführen zu können, muss zuerst die Schaltfläche zum Starten des Turtleizers gedrückt werden, um das Turtleizer-Fenster zu öffnen. Dadurch wird automatisch auch das Executor-Steuerfeld geöffnet. Solange das Turtleizer-Fenster offen ist, reicht es für einen weiteren Start aus, das Executor-Steuerfeld über die entsprechende Schaltfläche aufzurufen. Ohne geöffnetes Turtleizer-Fenster werden Turtleizer-Prozeduren nicht erkannt und führen beim Ausführungsversuch zu Fehlern.
Immer wenn das Turtleizer-Fenster (erneut) geöffnet wird, wird die Zeichenfläche geleert und eine neue Heimatposition der Schildkröte in der Mitte des Fensters gesetzt (unabhängig von dessen vorheriger Größe). Da der Zoomfaktor beim Wiederöffnen nicht zurückgesetzt wird, berücksichtigen die neuen Heimatkoordinaten den Zoomfaktor. Diese Heimatposition bleibt als Startkoordinate für alle nachfolgenden Schildkröten-Diagrammausführungen während der Sitzung erhalten, bis Sie das Turtleizer-Fenster schließen und wieder öffnen.
Wenn das Turtleizer-Fenster geschlossen wird, nachdem es zuvor geöffnet war, verursachen Turtleizer-Prozeduren keine Fehler, aber das Zeichnen erfolgt vergeblich, da das Turtleizer-Fenster nicht automatisch wieder öffnet und beim erneuten Öffnen der Inhalt gelöscht wird.
Die Schildkröte kann durch negative Koordinatenbereiche wandern (d. h. über den oberen oder linken Rand hinaus), aber ihre Spur ist dort nicht sichtbar (auch die Schildkröte selbst nicht, bis sie in den positiven Quadranten zurückkehrt). Ab Version 3.30-12 besteht jedoch die Möglichkeit, das Zeichenergebnis über die Turtleizer-GUI in den sichtbaren Quadranten zu verschieben (siehe Kontextmenü – Verschiebungsbehandlung).
Beispiel
Der folgende Algorithmus zeichnet ein kleines Haus mit Grundhöhe und -breite aus einer Eingabe sowie einem Dreiecksdach (mit rechtem Winkel an der Spitze):

Das gezeichnete Bild mit width = 200 und height = 100:

Beachten Sie, dass die Anweisung setBackground(128,255,255), die für die cyanfarbene Leinwandfarbe verantwortlich ist, dies nur über die RGB-Argumente 128, 255, 255 erreicht – die Elementfarbe hat keinen Effekt und wurde hier lediglich zur Veranschaulichung eingesetzt. Die rote Farbe der Dachlinien hingegen ist auf die Einfärbung der letzten beiden „forward"-Elemente zurückzuführen.
Hilfe zur Umstellung des Diagrammcodes
Wenn Sie die Konsequenzen der Pixelrundungen beim ganzzahligen Koordinatenmodell im Vergleich zum Gleitkommamodell untersuchen möchten, oder wenn Sie in früheren Diagrammen die Kurznamen verwendet haben und zum Gleitkommamodell wechseln möchten, helfen Ihnen die zwei Menüpunkte im Structorizer-Menü „Edit":
- To fine graphics ersetzt alle Vorkommen der Turtleizer-Prozeduren
fdundbkim ausgewählten Elementbereich durchforwardbzw.backward. - To integer graphics macht das Umgekehrte (d. h. ersetzt
forwarddurchfdundbackwarddurchbk).
Wenn Sie ein strukturiertes Element ausgewählt haben (z. B. eine Schleife), werden alle direkt und indirekt enthaltenen Anweisungen einbezogen, nicht jedoch Anweisungen in aufgerufenen Unterroutinen. Um alle Anweisungen des gesamten Diagramms auf einmal zu konvertieren, wählen Sie einfach das umrahmende Programm- oder Routinenelement aus. Diese Anweisungsersetzungen sind vollständig rückgängig zu machen und wiederherstellbar.
Eine vorherige Prüfung, ob die Auswahl überhaupt relevante Turtleizer-Anweisungen enthält, verhindert unnötige Undo/Redo-Einträge. Nach der Konvertierung erscheint ein Meldungsfenster mit der Anzahl der durchgeführten Ersetzungen.
Turtleizer-GUI (ab Version 3.30-12)
Ab Version 3.30-12 bietet das Turtleizer-Fenster mehrere nützliche interaktive Funktionen:
- Scrollbalken ermöglichen das Scrollen über die gesamte Zeichnung.
- Eine Statusleiste (standardmäßig aktiviert) zeigt aktuelle Informationen unten an.
- Ein Kontextmenü bietet Navigation, Zoomen, Verschiebung, Anzeigeeinstellungen und Export.
- Tastenkürzel ermöglichen ebenfalls Zoomen, Scrollen, Export oder Anpassung der Darstellung.
- Ein Popup zeigt die Weltkoordinaten der Schildkröte unter der Mausposition an (ab Version 3.30-13).
- Beim Ziehen mit der Maus kann die gezogene Linie gemessen werden (ab Version 3.30-13).

Statusleiste
Die Statusleiste zeigt von links nach rechts:
- Heimatposition der Schildkröte (Pixelkoordinaten);
- Aktuelle Position und Ausrichtung der Schildkröte (Pixelkoordinaten und Winkel von Norden im Uhrzeigersinn in Grad);
- Ausdehnung des erreichbaren Teils der Zeichnung (Breite × Höhe in Pixeln; versteckte Teile im negativen Koordinatenbereich werden nicht berücksichtigt);
- Aktuelle Koordinatenbereiche (xmin..xmax : ymin..ymax) des Scroll-Viewports;
- Zoomfaktor (in Prozent);
- Einrastmodus-Anzeige für die Messfunktion: Einrasten an Linien oder Einrasten an Punkten (siehe Messen).
Tooltips helfen, die jeweiligen Inhalte zu beschreiben.
Kontextmenü – Navigation
Über das Kontextmenü können Sie die Scrollansicht zu folgenden Positionen bewegen:
- Eine vom Benutzer angegebene Koordinate (über einen erscheinenden Koordinatendialog einzugeben);
- Die aktuelle Schildkrötenposition;
- Die Heimatposition der Schildkröte (vor einer Ausführung sind aktuelle und Heimatposition identisch; nach dem Verschieben einer verschobenen Zeichnung wird die relative Heimatposition bezogen auf die Zeichnung angezeigt);
- Der Koordinatenursprung, d. h. Schildkröten-Weltposition (0, 0).
Turtleizer zentriert die Ansicht um die angegebene Position, sofern diese nicht zu nah an einem der Leinwandränder liegt. Eine Navigation zu negativen Koordinatenpositionen oder zu Positionen jenseits der Zeichnungsausdehnung im positiven Koordinatenbereich ist nicht möglich.
Kontextmenü – Zoomunterstützung
Das Vergrößern und Verkleinern ist über die Tasten + und - des Ziffernblocks oder durch Drehen des Mausrads bei gedrückter Strg-Taste möglich.
Zusätzlich können Sie über das Kontextmenü:
- Den Zoomfaktor auf 100 % zurücksetzen oder
- auf den tatsächlich darstellbaren Teil der Schildkrötenzeichnung zoomen (d. h. die Teile im positiven Koordinatenbereich), sodass die Zeichnung in den aktuellen Viewport passt.
Beachten Sie, dass der Zoomfaktor durch den Start einer Diagrammausführung nicht zurückgesetzt wird.
Kontextmenü – Verschiebungsbehandlung
Ihre Zeichnung passt nicht ganz in den positiven Quadranten, d. h. einige Liniensegmente wurden jenseits des linken oder oberen Randes platziert? Kein Problem: Turtleizer erlaubt es nun, das gesamte Bild nachträglich automatisch in den Leinwandbereich zu verschieben:
- Der Menüpunkt „Make all drawing visible" (oder Taste A) vergrößert die Leinwand, um die gesamte Zeichnung einzuschließen, also auch alle im negativen Koordinatenbereich gezeichneten Liniensegmente. (Diese Anpassung ist nicht rückgängig zu machen. Die nächste Zeichnung beginnt aber wieder nur im positiven Koordinatenbereich.)
- Nach dieser Erweiterung der Leinwand können Sie ein gestricheltes hellrotes Achsenkreuz anzeigen, um den Koordinatenursprung (0, 0) zu markieren. Verwenden Sie dazu den Umschalt-Menüpunkt „Show axes of coordinates" oder die Taste O.

Wenn die Zeichnung keine Teile außerhalb des positiven Leinwandbereichs hat, sind diese Menüpunkte einfach deaktiviert.
Kontextmenü – Ansichts- und Messeinstellungen
Das Kontextmenü ermöglicht:
- Umschalten der Sichtbarkeit der Schildkröte (alternativ zu
hideTurtle()/showTurtle()-Aufrufen im ausgeführten Diagramm); - Festlegen der Hintergrundfarbe der Turtleizer-Leinwand (alternativ zu
setBackgroundColor()-Aufrufen) über einen Farbauswahldialog; - Umschalten der Sichtbarkeit der Statusleiste (standardmäßig aktiviert);
- Ein- oder Ausschalten des Tooltips, der die Leinwandkoordinate an der aktuellen Mausposition anzeigt (ab Version 3.30-13, standardmäßig aktiviert);
- Umschalten des Messmodus zwischen Einrasten an der nächstgelegenen Linie oder ausschließlich Einrasten an nächstgelegenen Punkten;
- Festlegen des Einrastradius für die Messfunktion im Bereich von 5 Pixeln (Standard) bis 100 Pixeln.

Beachten Sie: Der Start einer Diagrammausführung setzt die Leinwand auf weißen Hintergrund zurück, beeinflusst jedoch weder die Sichtbarkeit der Schildkröte noch der Statusleiste, die Einrasteinstellungen usw.
Kontextmenü – Inhaltsexport
Neben dem einfachen Speichern eines Screenshots kann der Zeicheninhalt nun auf verschiedene Arten direkt exportiert werden:
- Als CSV-Datei (kommagetrennte Werte);
- Als PNG-Bilddatei;
- Als SVG-Vektorgrafikdatei.
CSV- und SVG-Dateien decken stets die gesamte Zeichnung ab, unabhängig davon, ob Teile außerhalb der Turtleizer-Leinwand liegen (im negativen Koordinatenbereich gezeichnet wurden). Der PNG-Export hingegen enthält genau den Teil der Zeichnung, der auf der Turtleizer-Leinwand sichtbar ist (einschließlich des Schildkrötensymbols und der Koordinatenachsen, falls diese beim Export sichtbar waren).
Ein CSV-Export erfasst alle von der Schildkröte gezeichneten Liniensegmente im CSV-Format (eine Zeile pro Segment). Die ersten beiden Spalten (xFrom, yFrom) enthalten die Startkoordinate des Segments, die nächsten beiden Spalten (xTo, yTo) die Endkoordinate, die fünfte Spalte enthält einen hexadezimal codierten Alpha-RGB-Wert. (Die Datei enthält nur sichtbare Liniensegmente, keine unsichtbaren Bewegungen.) Die resultierende Datei kann in einem Tabellenkalkulationsprogramm wie LibreOffice Calc oder MS Excel geöffnet werden.

Der Dateiauswahldialog erlaubt die Wahl des bevorzugten Spaltentrennzeichens (ab Version 3.30-13):

Beim PNG-Export wird eine Kopie des Turtleizer-Leinwandinhalts als Bilddatei in Originalgröße gespeichert (Zoomfaktor wird ignoriert). Abgeschnittene Teile links und oben im Turtleizer-Fenster werden auch in der PNG-Datei abgeschnitten. Der Schritt „Make all drawing visible" garantiert, dass die gesamte Zeichnung in die Bilddatei exportiert wird. Ist die Schildkröte sichtbar, erscheint sie im Bild (zum Ausblenden Kontextmenü oder Taste T verwenden).
Beim SVG-Export wird ein Koordinatenversatz angewendet, der die gesamte Zeichnung in positive Koordinatenbereiche transformiert, sodass keine Teile fehlen. Die Bildgröße entspricht dabei genau den Grenzen der Zeichnung ohne Umrandung. Ein ganzzahliger Skalierungsfaktor kann angegeben werden (der Zoomfaktor des Turtleizer-Fensters wird ignoriert):



Ein Skalierungsfaktor > 1 kann bei sehr dichten Linienmustern sinnvoll sein, die in Originalgröße nach dem Export optisch schlecht aussehen könnten. Als Vektorgrafik ändert sich durch die Skalierung wenig, aber die Standard-Anzeigegröße wird vergrößert, sodass das resultierende Bild besser aussieht, wenn es z. B. direkt im Browser angezeigt wird. Das folgende Beispiel zeigt ein Mäandermuster, das mit einem Linienabstand von 1 Pixel (= Linienabstand 2) gezeichnet wurde:

Die mit Skalierungsfaktor 1 exportierte SVG-Grafik sieht im Browser schlecht aus:

Dieselbe Zeichnung als SVG mit Faktor 4 exportiert zeigt das präzise Muster:

(Das Ergebnis des Heranzoomens der ersten SVG-Datei mit Faktor 4 im Viewer sieht natürlich identisch aus, d. h. der Standardskalierungsfaktor 1 verursacht keinen tatsächlichen Verlust, erfordert aber möglicherweise eine Skalierung im Zielkontext, um einen zufriedenstellenden Effekt zu erzielen.)
Messen

Während Sie die Maus bei gedrückter linker Maustaste ziehen, ändert sich der Cursor zu einer Fadenkreuzform, eine gestrichelte hellblaue Messlinie wird gezeichnet, und ein Popup zeigt:
- Die Länge der Linie (in Pixeln),
- das Paar der Koordinatendifferenzwerte (delta X, delta Y) in Klammern und
- die Ausrichtung der Linie (in Grad, im Uhrzeigersinn von Norden, wie
getOrientation()sie zurückgeben würde).
Die Messlinie rastet automatisch an der nächstgelegenen gezeichneten Linie (oder nur an Start-/Endpunkten, je nach Konfiguration) innerhalb des konfigurierten Radius ein (standardmäßig 5 Pixel). Die Statusleiste zeigt an, welcher Einrastmodus aktiv ist. Der Einrastmodus kann über Taste L oder den entsprechenden Menüpunkt geändert werden.
Durch Gedrückthalten der Shift-Taste beim Ziehen kann die Messlinie auf eine strikt horizontale oder vertikale Richtung gezwungen werden.
Turtleizer-Hilfe
Durch Drücken von F1 wird diese User-Guide-Seite im Browser angezeigt. Mit AltF1 werden stattdessen die Turtleizer-Tastenkürzel angezeigt.
Aspekte des Code-Exports
Im exportierten Code wird die Turtleizer-API in den meisten Fällen nicht direkt funktionieren, da die Prozeduren und Funktionen in den meisten Zielsprachen nicht nativ vorhanden sind. Python enthält jedoch ein kompatibles Modul „turtle" (mit einigen notwendigen Namenskonvertierungen), das vom Python-Generator von Structorizer seit Version 3.28-10 angesprochen wird. Für Java und C++ sind exakt kompatible Quellpakete verfügbar. Einzelheiten und Links finden Sie unter Export Source Code.
Für andere Zielsprachen können Sie möglicherweise eine anpassbare Turtle-Anwendung oder -Bibliothek im Internet finden und mit Ihrem exportierten Code integrieren. (Teilen Sie uns gerne mit, wenn Sie ein einfach zu verwendendes, kompatibles FOSS-Turtle-Modul für eine der unterstützten Exportsprachen entdecken.)