home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / crm_demo / p_pascal / turtle / turtles.pas < prev   
Pascal/Delphi Source File  |  1992-05-27  |  9KB  |  393 lines

  1. (* UNIT Turtles zur Erzeugung von Turtlegraphik                   *)
  2. (* Copyright 1992 by Application Systems Heidelberg Software GmbH *)
  3. UNIT Turtles;
  4.  
  5. (* öffentlicher Teil *)
  6. INTERFACE
  7.  
  8. (* Konstanten *)
  9. CONST    MaxX        =    1000;        (* maximale X-Koordinate *)
  10.         MaxY        =    1000;        (* maximale Y-Koordinate *)
  11.         MinPhi        =    0;            (* minimaler Winkel *)
  12.         MaxPhi        =    359;        (* maximaler Winkel *)
  13.         MaxWidth    =    2 * MaxX;    (* maximale Breite (-1) *)
  14.         MaxHeight    =    2 * MaxY;    (* maximale Höhe (-1) *)
  15.  
  16. TYPE    CoordX        =    -MaxX..MaxX;        (* Wertebereich horizontal *)
  17.         CoordY        =    -MaxY..MaxY;        (* Wertebereich vertikal *)
  18.         Angel        =    MinPhi..MaxPhi;        (* Wertebereich Winkel *)
  19.         AngelRange    =    -MaxPhi..MaxPhi;    (* erlaubte Winkelveränderung *)
  20.         TurtleBase    =    OBJECT                (* Basisobjekt Turtle *)
  21.                             X            : CoordX;    (* x-Koordinate *)
  22.                             Y            : CoordY;    (* y-Koordinate *)
  23.                             Phi            : Angel;    (* Winkel *)
  24.                             v_handle,                (* VDI-Handle *)
  25.                             ScreenX,                (* max. x-Koordinate *)
  26.                             ScreenY,                (* max. y-Koordinate *)
  27.                             ColorBackground,        (* Farbe Hintergrund *)
  28.                             ColorLine,                (* Farbe Linie *)
  29.                             ColorTurtle    : INTEGER;    (* Farbe Turtle *)
  30.                             Visible,                (* Turtle sichtbar? *)
  31.                             Paint,                    (* Turtle zeichnet? *)
  32.                             ErrorFlag,                (* Fehler? *)
  33.                             WithDraw,                (* Mit Draw? *)
  34.                             Shown        : BOOLEAN;    (* Turtle gezeichnet? *)
  35.  
  36.  
  37.                             (* Initialisieren *)
  38.                             CONSTRUCTOR Init;
  39.  
  40.                             (* Abmelden *)
  41.                             DESTRUCTOR Done;
  42.  
  43.                             (* Fehlerabfrage *)
  44.                             FUNCTION Error : BOOLEAN;
  45.  
  46.                             (* Bildschirm löschen *)
  47.                             PROCEDURE Clear;
  48.  
  49.                             (* Position und Ausrichtung setzen *)
  50.                             PROCEDURE Default(nx : CoordX; ny : CoordY; nw : Angel);
  51.  
  52.                             (* Linienfarbe setzen *)
  53.                             PROCEDURE LineColor(c : INTEGER);
  54.  
  55.                             (* Hintergrundfarbe setzen *)
  56.                             PROCEDURE BackgroundColor(c : INTEGER);
  57.  
  58.                             (* Turtlefarbe setzen *)
  59.                             PROCEDURE TurtleColor(c : INTEGER);
  60.  
  61.                             (* Linienfarbe ermitteln *)
  62.                             FUNCTION GetLineColor : INTEGER;
  63.  
  64.                             (* Hintergrundfarbe ermitteln *)
  65.                             FUNCTION GetBackgroundColor : INTEGER;
  66.  
  67.                             (* Turtlefarbe ermitteln *)
  68.                             FUNCTION GetTurtleColor : INTEGER;
  69.  
  70.                             (* Turtle im positiven Sinne drehen *)
  71.                             PROCEDURE Turn(nw : AngelRange);
  72.  
  73.                             (* Turtle bewegen *)
  74.                             PROCEDURE Go(amount : INTEGER);
  75.  
  76.                             (* Stift anheben *)
  77.                             PROCEDURE PenUp;
  78.  
  79.                             (* Stift senken *)
  80.                             PROCEDURE PenDown;
  81.  
  82.                             (* Turtle zeigen *)
  83.                             PROCEDURE Show;
  84.  
  85.                             (* Turtle verstecken *)
  86.                             PROCEDURE Hide;
  87.  
  88.                             (* Turtle zeichnen *)
  89.                             PROCEDURE Draw(showit : BOOLEAN);
  90.                         END;
  91.         Turtle        =    OBJECT(TurtleBase)    (* normale Turtle *)
  92.  
  93.                             (* Drehung nach links *)
  94.                             PROCEDURE Left(w : Angel);
  95.  
  96.                             (* Drehung nach rechts *)
  97.                             PROCEDURE Right(w : Angel);
  98.  
  99.                             (* Bewegung vorwärts *)
  100.                             PROCEDURE Forward(amount : INTEGER);
  101.  
  102.                             (* Bewegung rückwärts *)
  103.                             PROCEDURE Backward(amount : INTEGER);
  104.                         END;
  105.         TurtleGeom    =    OBJECT(Turtle)        (* erweiterte Turtle *)
  106.  
  107.                             (* Rechteck ausgeben *)
  108.                             PROCEDURE Rectangle(w, h : INTEGER);
  109.                         END;
  110.  
  111. (* Implementation *)
  112. IMPLEMENTATION
  113.  
  114. (* UNITs GEM und TOS importieren *)
  115. USES Gem, Tos;
  116. VAR Dummy : INTEGER;
  117. (* *** Methoden von TurtleBase *** *)
  118. CONSTRUCTOR TurtleBase.Init;
  119. VAR    i    : INTEGER;
  120.     WorkIn        : workin_array;
  121.     WorkOut        : workout_array;
  122. BEGIN
  123.  
  124.     (* Variablen vorbesetzen *)
  125.     ErrorFlag        := FALSE;
  126.     ColorBackground    := White;
  127.     ColorLine        := Black;
  128.     ColorTurtle        := Blue;
  129.     Visible            := TRUE;
  130.     Paint            := TRUE;
  131.     Shown            := FALSE;
  132.     WithDraw        := TRUE;
  133.  
  134.     (* virtuelle VDI-Workstation öffnen *)
  135.     v_handle        := graf_handle(Dummy, Dummy, Dummy, Dummy);
  136.     FOR i:=1 TO 9 DO
  137.         WorkIn[i]    := 1;
  138.     WorkIn[0]    := 2 + Getrez;
  139.     WorkIn[10]    := 2;
  140.     v_opnvwk(WorkIn, v_handle, WorkOut);
  141.     IF v_handle = 0 THEN
  142.     BEGIN
  143.         ErrorFlag    := TRUE;
  144.         EXIT
  145.     END;
  146.  
  147.     (* Bildschirmgröße ermitteln *)
  148.     ScreenX    := WorkOut[0];
  149.     ScreenY    := WorkOut[1];
  150.  
  151.     (* Vorbereitung des Bildschirms *)
  152.     Draw(TRUE);
  153.     Clear;
  154.     Default(0, 0, 90)
  155. END;
  156.  
  157. DESTRUCTOR TurtleBase.Done;
  158. BEGIN
  159.     Draw(FALSE);
  160.     IF v_handle <> 0 THEN
  161.         v_clsvwk(v_handle)
  162. END;
  163.  
  164. PROCEDURE TurtleBase.Clear;
  165. VAR    xy        : ARRAY_4;
  166. BEGIN
  167.     Draw(FALSE);
  168.     v_clrwk(v_handle);
  169.     Dummy    := vswr_mode(v_handle, MD_REPLACE);
  170.     Dummy    := vsf_color(v_handle, ColorBackground);
  171.     xy[0]    := 0;
  172.     xy[1]    := 0;
  173.     xy[2]    := ScreenX;
  174.     xy[3]    := ScreenY;
  175.     v_bar(v_handle, xy);
  176.     Draw(TRUE)
  177. END;
  178.  
  179. PROCEDURE TurtleBase.Default(nx : CoordX; ny : CoordY; nw : Angel);
  180. BEGIN
  181.     Draw(FALSE);
  182.     X    := nx;
  183.     Y    := ny;
  184.     Phi    := nw;
  185.     Draw(TRUE)
  186. END;
  187.  
  188. PROCEDURE TurtleBase.LineColor(c : INTEGER);
  189. BEGIN
  190.     ColorLine    := c
  191. END;
  192.  
  193. PROCEDURE TurtleBase.BackgroundColor(c : INTEGER);
  194. BEGIN
  195.     ColorBackground    := c
  196. END;
  197.  
  198. PROCEDURE TurtleBase.TurtleColor(c : INTEGER);
  199. BEGIN
  200.     ColorTurtle    := c
  201. END;
  202.  
  203. FUNCTION TurtleBase.GetLineColor : INTEGER;
  204. BEGIN
  205.     GetLineColor    := ColorLine
  206. END;
  207.  
  208. FUNCTION TurtleBase.GetBackgroundColor : INTEGER;
  209. BEGIN
  210.     GetBackgroundColor    := ColorBackground
  211. END;
  212.  
  213. FUNCTION TurtleBase.GetTurtleColor : INTEGER;
  214. BEGIN
  215.     GetTurtleColor    := ColorTurtle
  216. END;
  217.  
  218. PROCEDURE TurtleBase.Turn(nw : AngelRange);
  219. BEGIN
  220.     IF WithDraw THEN
  221.         Draw(FALSE);
  222.     Phi    := (MaxPhi + 1 + Phi + nw) MOD (MaxPhi + 1);
  223.     IF WithDraw THEN
  224.         Draw(TRUE)
  225. END;
  226.  
  227. PROCEDURE TurtleBase.Go(amount : INTEGER);
  228. VAR    OldX        : CoordX;
  229.     OldY        : CoordY;
  230.     xy            : ptsin_ARRAY;
  231.     XNeu, YNeu    : INTEGER;
  232.     Argument    : REAL;
  233. BEGIN
  234.     IF WithDraw THEN
  235.         Draw(FALSE);
  236.     
  237.     OldX    := X;
  238.     OldY    := Y;
  239.  
  240.     (* neue Koordinaten in der richtigen Richtung *)
  241.     Argument    := (PI * Phi) / 180.0;
  242.     XNeu        := X + ROUND(amount * COS(Argument));
  243.     YNeu        := Y + ROUND(amount * SIN(Argument));
  244.  
  245.     (* Bildschirmgrenzen berücksichtigen *)
  246.     IF ABS(XNeu) > MaxX THEN
  247.     BEGIN
  248.         IF XNeu < 0 THEN
  249.             X    := -MaxX
  250.         ELSE
  251.             X    := MaxX
  252.     END
  253.     ELSE
  254.         X    := XNeu;
  255.     IF ABS(YNeu) > MaxY THEN
  256.     BEGIN
  257.         IF YNeu < 0 THEN
  258.             Y    := -MaxY
  259.         ELSE
  260.             Y    := MaxY
  261.     END
  262.     ELSE
  263.         Y    := YNeu;
  264.  
  265.     (* Ausgabe, wenn Flag gesetzt ist *)
  266.     IF Paint THEN
  267.     BEGIN
  268.         Dummy    := vsl_color(v_handle, GetLineColor);
  269.  
  270.         (* Die Koordinaten müssen umgerechnet werden! *)
  271.         xy[0]    := ROUND((LONGINT(OldX + MaxX) * LONGINT(ScreenX)) /
  272.                             LONGINT(MaxWidth));
  273.         xy[1]    := ROUND((LONGINT(MaxHeight - OldY - MaxY) *
  274.                             LONGINT(ScreenY)) / LONGINT(MaxHeight));
  275.         xy[2]    := ROUND((LONGINT(X + MaxX) * LONGINT(ScreenX)) /
  276.                             LONGINT(MaxWidth));
  277.         xy[3]    := ROUND((LONGINT(MaxHeight - Y - MaxY) *
  278.                             LONGINT(ScreenY)) / LONGINT(MaxHeight));
  279.         v_pline(v_handle, 2, xy)
  280.     END;
  281.     IF WithDraw THEN
  282.         Draw(TRUE)
  283. END;
  284.  
  285. PROCEDURE TurtleBase.PenUp;
  286. BEGIN
  287.     Paint    := FALSE
  288. END;
  289.  
  290. PROCEDURE TurtleBase.PenDown;
  291. BEGIN
  292.     Paint    := TRUE
  293. END;
  294.  
  295. PROCEDURE TurtleBase.Show;
  296. BEGIN
  297.     Visible    := TRUE;
  298.     Draw(TRUE)
  299. END;
  300.  
  301. PROCEDURE TurtleBase.Hide;
  302. BEGIN
  303.     Draw(FALSE);
  304.     Visible    := FALSE
  305. END;
  306.  
  307. PROCEDURE TurtleBase.Draw(showit : BOOLEAN);
  308. CONST    TurtleSize    = 40;
  309. VAR        OldColor    : INTEGER;
  310.         OldPaint        : BOOLEAN;
  311. BEGIN
  312.     IF Visible THEN
  313.     BEGIN
  314.         IF (NOT(Shown) AND showit) OR
  315.            (Shown AND NOT(showit)) THEN
  316.         BEGIN
  317.             WithDraw    := FALSE;
  318.             OldPaint    := Paint;
  319.             Paint        := TRUE;
  320.             Shown        := NOT(Shown);
  321.             Dummy        := vswr_mode(v_handle, MD_XOR);
  322.             OldColor    := GetLineColor;
  323.             LineColor(ColorTurtle);
  324.             Turn(150);
  325.             Go(TurtleSize);
  326.             Turn(120);
  327.             Go(TurtleSize);
  328.             Turn(120);
  329.             Go(TurtleSize);
  330.             Turn(-30);
  331.             LineColor(OldColor);
  332.             Dummy        := vswr_mode(v_handle, MD_REPLACE);
  333.             Paint        := OldPaint;
  334.             WithDraw    := TRUE
  335.         END
  336.     END
  337. END;
  338.  
  339. FUNCTION TurtleBase.Error : BOOLEAN;
  340. BEGIN
  341.     Error        := ErrorFlag;
  342.     ErrorFlag    := FALSE
  343. END;
  344.  
  345. (* *** Methoden von Turtle *** *)
  346. PROCEDURE Turtle.Left(w : Angel);
  347. BEGIN
  348.     Turn(w)
  349. END;
  350.  
  351. PROCEDURE Turtle.Right(w : Angel);
  352. BEGIN
  353.     Turn(-w)
  354. END;
  355.  
  356. PROCEDURE Turtle.Forward(amount : INTEGER);
  357. BEGIN
  358.     Go(amount)
  359. END;
  360.  
  361. PROCEDURE Turtle.Backward(amount : INTEGER);
  362. BEGIN
  363.     Go(-amount)
  364. END;
  365.  
  366. (* *** Methoden von TurtleGeom *** *)
  367. PROCEDURE TurtleGeom.Rectangle(w, h : INTEGER);
  368. VAR    HalfW, HalfH    : INTEGER;
  369. BEGIN
  370.     w        := w - w MOD 2;
  371.     h        := h - h MOD 2;
  372.     HalfW    := w DIV 2;
  373.     HalfH    := h DIV 2;
  374.     PenUp;
  375.     Backward(HalfH);
  376.     PenDown;
  377.     Right(90);
  378.     Forward(HalfW);
  379.     Left(90);
  380.     Forward(h);
  381.     Left(90);
  382.     Forward(w);
  383.     Left(90);
  384.     Forward(h);
  385.     Left(90);
  386.     Forward(HalfW);
  387.     Left(90);
  388.     PenUp;
  389.     Forward(HalfH);
  390.     PenDown
  391. END;
  392.  
  393. END.