(************************************************************************)
(*                                                                      *)
(*      Turtlegrafik                                                    *)
(*                                                                      *)
(************************************************************************)
(*                                                                      *)
(* © 1990 by Ingo Schütze                                               *)
(* Grabenstraße 29, D-6301 Biebertal, 06409-2882                        *)
(*                                                                      *)
(************************************************************************)
DEFINITION MODULE Turtle;

FROM MathLib IMPORT REAL;

FROM UG IMPORT Pt2D, Interval2D;


TYPE
  TurtleTyp     = Pt2D;         (* RECORD X,Y : REAL END;       *)
  Screens       = (low, lowlace, high, highlace);

VAR
  UserSystem    : Interval2D;   (* ARRAY [1..2] OF Pt2D END;    *)

  Angle         : INTEGER;      (* Globale Winkel *)
  phi           : REAL;
  Turtle        : TurtleTyp;    (* Die Kröte *)
  Color         : INTEGER;      (* Globale Farbe *)
                (* Farbzuordnungen:
                        schwarz 0, rot  1, grün 2, blau  3, gelb  4,
                        magenta 5, cyan 6, grau 7, braun 8, weiss 9,.. *)



PROCEDURE Error ( i : INTEGER );
(* Die Implementierten Fehlermeldungen lese man in Turtle.mod nach.     *)





PROCEDURE GMode(        ScreenMode : Screens;
                        xleftdown, yleftdown, xrightup, yrightup : REAL );
(************************************************************************)
(*      Anzugeben sind in BenutzerKoordinaten die Ecken links unten     *)
(*      und rechts oben, sowie der Auflösungsmodi (siehe oben).         *)
(*      Als Auflösungsmodi kann man von hier Importieren:               *)
(*      low, lowlace, high oder highlace                                *)
(*                                                                      *)
(*              +-------------------------------*(xru,yru)              *)
(*              |                               |                       *)
(*              |       AmigaScreen             |                       *)
(*              |                               |                       *)
(*              *-------------------------------+                       *)
(*              (xld,yld)                                               *)
(*                                                                      *)
(************************************************************************)

PROCEDURE GraphMode;
(************************************************************************)
(* Stellt ein ZeichenFenster mit einem Benutzerkoordinatensystem        *)
(* von -10..10 in x und y Richtung zur Verfügung und zwar in der        *)
(* Auflösung high. Das entspricht einem (640x256) großen Screen         *)
(************************************************************************)

PROCEDURE TextMode;
(************************************************************************)
(* Schaltet auf das normale Ausgabefenster zurück. Dabei geht das Bild  *)
(* verloren! Muß jedoch unbedingt vor Beendigung ausgeführt werden      *)
(* Bevor man in den Textmodus zurückgelangt, wird unten rechts ein      *)
(* rotes RechtEck gezeichnet. Dann wartet das System noch auf einen     *)
(* Tastendruck, bevor der Screen geschlossen wird.                      *)
(************************************************************************)

PROCEDURE ClearScreen;
(************************************************************************)
(* Löscht den Turtle-Screen und setzt die Turtle in den NullPunkt       *)
(************************************************************************)

PROCEDURE SetColor ( Col : INTEGER );
(************************************************************************)
(* Farbe wählen. Voreingestellt ist weiss. Farbzuordnungen soehe oben   *)
(************************************************************************)

PROCEDURE Home;
(************************************************************************)
(* Setzt die Turtle in den NullPunkt.                                   *)
(************************************************************************)

PROCEDURE Up;
(************************************************************************)
(* Zeichenstift hoch. Danach hinterlassen Bewegungen keine Spur mehr    *)
(* Mit anderen Worten: Es wird nix mehr gezeichnet                      *)
(************************************************************************)
PROCEDURE Down;
(************************************************************************)
(* Zeichenstift wieder runter.                                          *)
(************************************************************************)




(************************************************************************)
(* Die Winkelprozeduren:                                                *)
(*   Bei den Prozeduren mit Set vorne geht der aktuelle Winkel nicht    *)
(*   mit ein, sondern wird einfach überschrieben. Der Rest bezieht sich *)
(*   auf den aktuellen Winkel und stellt eine Drehung der Turtle dar    *)
(************************************************************************)
PROCEDURE SetAngle ( w : INTEGER );                     (* w aus 0..360 *)
PROCEDURE SetPhi ( p : REAL );                          (* p aus 0..2¶  *)

PROCEDURE Turn ( w : INTEGER );
PROCEDURE Left ( w : INTEGER );
PROCEDURE Right ( w : INTEGER );

PROCEDURE TurnRad ( p : REAL );
(* Dasselbe wie Turn nur im Bogenmaß. Left und Right gibts nicht im     *)
(* Bogenmaß, also mit TurnRad arbeiten. Ist eh egal.                    *)




(************************************************************************)
(* Die Bewegungen:                                                      *)
(************************************************************************)

PROCEDURE MoveTo ( x, y : REAL );
(************************************************************************)
(* Bewegt die Turtle (ohne zu Zeichnen) an den Punkt (x,y)              *)
(************************************************************************)

PROCEDURE SetTurtle ( x, y : REAL );
(************************************************************************)
(* Dasselbe wie MoveTo                                                  *)
(************************************************************************)

PROCEDURE DrawTo ( x, y : REAL );
(************************************************************************)
(* Zeichnet zu dem Punkt mit den Koordinaten (x,y) in Problemkoordinaten*)
(* Ausgehend von der aktuellen Turtleposition wird in der Farbe         *)
(* gezeichnet, die zuletzt mit SetColor bestimmt wurde (oder weiss)     *)
(************************************************************************)

PROCEDURE Forward ( length : REAL );
(************************************************************************)
(* Zeichnet von der Aktuellen Turtleposition aus eine Linie der Länge   *)
(* length. Die Richtung der Linie hat der aktuelle Winkel inne          *)
(************************************************************************)

PROCEDURE Backward ( length : REAL );
(************************************************************************)
(* Entspricht Forward(-length);                                         *)
(************************************************************************)




(************************************************************************)
(* Ein paar vordefinierte Objekte:                                      *)
(************************************************************************)

PROCEDURE Square ( length : REAL );
(************************************************************************)
(* Zeichnet Quadrat mit der Seitenlänge length.                         *)
(* Ausgangs- und EndPunkt ist der Punkt links unten im Quadrat.         *)
(************************************************************************)

PROCEDURE Triangle ( length : REAL );
(************************************************************************)
(* Zeichnet gleichseitiges Dreieck mit der Seitenlänge length           *)
(* Ausgangs- und EndPunkt ist der Punkt links unten in einem aufrecht   *)
(* stehendem gleichseitigen Dreieck.                                    *)
(************************************************************************)

PROCEDURE nEck ( length : REAL; n : INTEGER );
(************************************************************************)
(* Zeichnet regelmäßiges Polygon durch n Punkte mit Seitenlänge length. *)
(************************************************************************)

PROCEDURE Circle ( MX, MY : REAL; R : REAL );
(************************************************************************)
(* Zeichnet einen Kreis mit Mittelpunkt (MX,MY) mit Radius R.           *)
(************************************************************************)


END Turtle.
