← ST-Computer 03 / 1988

Turtle-Grafiken: Die Schildkröte geht fremd

Programmierpraxis

Turtle-Graphik ist nicht nur LOGO Vorbehalten. Auch in anderen Hochsprachen wie Pascal lassen sich geeignete Routinen aufbauen.

Die hier vorgestellte Include-Datei läßt sich in jedes Programm einbinden. Allerdings sind die Routinen an GEM gebunden. TURTLE.INC stellt die vier Bewegungskommandos vorwaerts, rueckwaerts, rechts und links zur Verfügung. Zusätzlich sind zwei Routinen vorhanden, die die Turtle an einer bestimmte Stelle auf dem Bildschirm mit einer bestimmten Ausrichtung plaziert.

ST Pascal Plus 2.0 akzeptiert Konstanten-, Typen-, Variablen- und andere Mehrfachdeklarationen. Daher ist es möglich, alle notwendigen Routinen in einer Include-Datei zusammenzufassen. Sie darf aber erst nach Einfügen der GEM-Dateien eingefügt werden, da die Turtle-Datei Routinen des GEM benutzt.

Eine kurze Erläuterung. Mit der Routine init_turtle legt man einen beliebigen Startpunkt auf dem Bildschirm fest. Zusätzlich wird eine Grundausrichtung vorgegeben. turtle_home hat eine geringere Funktion. Sie entspricht init_turtle, setzt aber die Turtle in die Mitte mit Ausrichtung nach oben, vorwaerts bewegt die Turtle pixelweise vorwärts, das heißt in die durch den Winkel festgelegte Richtung, rueckwaerts verfährt analog, jedoch in die entgegengesetzte Richtung. Mit rechts und links kann man die Turtle-Richtung ändern. Hierbei ist immer ein Winkel von der Grundrichtung aus gemeint. Beispiel: Die Turtle bewegt sich in Richtung 90 Grad. Nun soll sie sich mit rechts(lO) drehen. Die neue Richtung ist dann 80 Grad. Bevor man eine der vier Bewegungsroutinen aufruft, sollte man die Turtle auf den Bildschirm mit init_turtle oder turtle_home setzen. Ansonsten gibt's nichts Besonderes zu beachten. Das kleine Beispielprogramm veranschaulicht Nutzungsmöglichkeiten der Turtle-Routinen.

Das Ergebnis des Demonstrationsprogrammms

TURTLE.INC

(* Include-Datei für Turtle-Routinen *) (* Entwickelt mit ST Pascal Plus 2.0 *) (* Dietmar Rabich, Dülmen *) type turtle_daten = record pos_x,pos_y,winkel : short_integer; end; var turtle : turtle_daten; {* globale Variablenvereinbarung *) (* Turtle vorwärts bewegen *) procedure vorwaerts (n:short__integer) ; (* Umrechnung in Bogenma_ *) function bogen{x:real):real; const pi=3.14159265; begin bogen:=x*pi/180; end; begin with turtle do begin pos_x:=pos_x+short_round(cos(bogen(winkel))*n); pos_y:=pos_y-short_round(sin(bogen(winkel))*n); line_to(pos_x,pos_y); end; end; (* Turtle rückwärts bewegen *) procedure rueckwaerts(n:short_integer); begin vorwaerts(-n); end; (* Turtle rechts drehen *) procedure rechts(w:short_integer); begin with turtle do begin winkel:=winkel-w; while winkela<0 do winkel:=winkel+360; end; end; (* Turtle links drehen *) procedure links (w:short_integer); begin with turtle do begin winkel:=winkel+w; while winkel>360 do winkel:=winkel-360; end; end; (* Turtle Position und Winkel zuordnen *) procedure init_turtle (x, y, w: short_integer) ; begin with turtle do begin pos_x:=x; pos_y:=y; winkel:=w; end; rechts(0); links(0); move_to(x, y); end; (* Turtle in die Mitte mit Ausrichtung nach oben *) procedure turtle_home; begin init_turtle(320,200,90); end; (* Demonstrationsprogramm für die Include-Datei TURTLE. INC *) (* Entwickelt mit ST Pascal Plus 2.0. Dietmar Rabich *) program demo__turtle; const { $I \INCLUDEXGEMCONST.INC } type {$I \INCLUDE\GEMTYPE.INC } {$I \INCLUDE\GEMSUBS.INC } {$I \INCLUDE\TURTLE. INC } (* <- Hier wird die Turtle-Datei eingelesen *) procedure quadrat(laenge:short_integer;dreh:boolean); var i : short_integer; begin if laenge>5 then for i:=1 to 4 do begin vorwaerts(laenge); if dreh then links(90) else rechts(90); quadrat(laenge div 2,not(dreh)); end; end; begin if init_gem>=0 then begin init_mouse; hide_mouse; clear_sereen; init_turtle(384,264, 90); quadrat(12 8,true); show_mouse; exit_gem; readln; end; end.
Dietmar Rabich