home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 09 / grafik6 / segdisp.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-08-09  |  5.1 KB  |  146 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                             SEGDISP.PAS                                 *)
  3. (*   Routinen zur Abarbeitung von "Segmenten" innerhalb der Grafikserie    *)
  4. (*-------------------------------------------------------------------------*)
  5. (*             Transformationsmatrix fuer ein Segment                 *)
  6. (*         in Abhaengigkeit v. TransFolge bereitstellen               *)
  7.  
  8. PROCEDURE KonstruiereMat(VAR Mat : tMatrix; Handle : SegNrBereich);
  9.  
  10. BEGIN
  11.   WITH SegTab[Handle] DO BEGIN
  12.     Einheitsmatrix(Mat);
  13.     CASE Transfolge OF
  14.       1 : BEGIN
  15.             Rotation(Mat,Drehwinkel);
  16.             Skalierung(Mat,XFaktor,YFaktor);
  17.             Translation(Mat,XPos,YPos);
  18.           END;
  19.       2 : BEGIN
  20.             Rotation(Mat,Drehwinkel);
  21.             Translation(Mat,XPos,YPos);
  22.             Skalierung(Mat,XFaktor,YFaktor);
  23.           END;
  24.       3 : BEGIN
  25.             Skalierung(Mat,XFaktor,YFaktor);
  26.             Rotation(Mat,Drehwinkel);
  27.             Translation(Mat,XPos,YPos);
  28.           END;
  29.       4 : BEGIN
  30.             Skalierung(Mat,XFaktor,YFaktor);
  31.             Translation(Mat,XPos,YPos);
  32.             Rotation(Mat,Drehwinkel);
  33.           END;
  34.       5 : BEGIN
  35.             Translation(Mat,XPos,YPos);
  36.             Rotation(Mat,Drehwinkel);
  37.             Skalierung(Mat,XFaktor,YFaktor);
  38.           END;
  39.       6 : BEGIN
  40.             Translation(Mat,XPos,YPos);
  41.             Skalierung(Mat,XFaktor,YFaktor);
  42.             Rotation(Mat,Drehwinkel);
  43.           END;
  44.     END;
  45.     Scherung(Mat,XShear,YShear);
  46.   END
  47. END;
  48.  
  49. (*--------------------------------------------------------------------*)
  50. (*     Display-Liste abarbeiten und auf den Bildschirm bringen.       *)
  51.  
  52. PROCEDURE ProcessList(Mat : tMatrix; Zeiger : tDFEintragP);
  53.  
  54. VAR Vektor1, Vektor2 : tVektor;
  55.     aktX, aktY : REAL;  (* Grafikcursor zur Berechnung *)
  56.                         (* von relativen Bewegungen.   *)
  57.  
  58. BEGIN
  59.   aktX := 0; aktY := 0;
  60.   WHILE Zeiger^.next <> NIL DO BEGIN
  61.     Vektor1[3] := 1;
  62.     WITH Zeiger^ DO BEGIN
  63.       CASE Kommando OF
  64.         EoDF   : ;
  65.         lnew   : BEGIN
  66.                    Vektor1[1] := x1;
  67.                    Vektor1[2] := y1;
  68.                    VektorTrans(Vektor1,Mat);
  69.                    Vektor2[1] := x2;
  70.                    Vektor2[2] := y2;
  71.                    Vektor2[3] := 1;
  72.                    VektorTrans(Vektor2,Mat);
  73.                    linew(Vektor1[1],Vektor1[2],
  74.                    Vektor2[1],Vektor2[2]);
  75.                    aktX := x2; aktY := y2;
  76.                  END;
  77.         pintw  : BEGIN
  78.                    Vektor1[1] := x;
  79.                    Vektor1[2] := y;
  80.                    VektorTrans(Vektor1,Mat);
  81.                    pointw(Vektor1[1],Vektor1[2]);
  82.                    aktX := x; aktY := y;
  83.                  END;
  84.         (* Bei Relativbewegungen transformierten Differenzvektor bilden. *)
  85.         mvewr,
  86.         lnewr,
  87.         pintwr  : BEGIN
  88.                    Vektor1[1] := aktX;
  89.                    Vektor1[2] := aktY;
  90.                    VektorTrans(Vektor1,Mat);
  91.                    Vektor2[1] := aktX + x;
  92.                    Vektor2[2] := aktY + y;
  93.                    Vektor2[3] := 1;
  94.                    VektorTrans(Vektor2,Mat);
  95.                    aktX := aktX + x; aktY := aktY + y;
  96.                    CASE Kommando OF
  97.                       mvewr : movewr(Vektor2[1] - Vektor1[1],
  98.                                      Vektor2[2] - Vektor1[2]);
  99.                       lnewr : linewr(Vektor2[1] - Vektor1[1],
  100.                                      Vektor2[2] - Vektor1[2]);
  101.                      pintwr : pointwr(Vektor2[1] - Vektor1[1],
  102.                                       Vektor2[2] - Vektor1[2]);
  103.                    END;
  104.                  END;
  105.         mvewa,
  106.         lnewa  : BEGIN
  107.                    Vektor1[1] := x;
  108.                    Vektor1[2] := y;
  109.                    VektorTrans(Vektor1,Mat);
  110.                    aktX := x; aktY := y;
  111.                    CASE Kommando OF
  112.                      mvewa : movewa(Vektor1[1],Vektor1[2]);
  113.                      lnewa : linewa(Vektor1[1],Vektor1[2]);
  114.                    END;
  115.                  END;
  116.       END;
  117.     END;
  118.     Zeiger := Zeiger^.next;
  119.   END;
  120. END;
  121.  
  122. (*--------------------------------------------------------------------*)
  123. (*                          Segment abarbeiten.                       *)
  124. (*  Wenn Delete TRUE ist, wird das grafische Objekt mit der Hinter-   *)
  125. (*                  grundfarbe (Schwarz) uebermalt.                   *)
  126.  
  127. PROCEDURE ProcessSeg(Handle : SegNrBereich; Delete : BOOLEAN);
  128.  
  129. VAR Mat : tMatrix;
  130.     Col : Sys_Colors;
  131.  
  132. BEGIN
  133.   IF SegTab[Handle].DFP <> NIL (* Illegales Handle ? *) THEN
  134.     IF SegTab[Handle].sichtbar THEN BEGIN
  135.       KonstruiereMat(Mat,Handle);
  136.       Col := Pen_Color;
  137.       IF Delete THEN
  138.         Set_Pen_Color(First_Color_Value);
  139.       ProcessList(Mat,SegTab[Handle].DFP);
  140.       Set_Pen_Color(Col);
  141.     END
  142. END;
  143.  
  144. (*-------------------------------------------------------------------------*)
  145. (*                         Ende von SEGDISP.PAS                            *)
  146.