home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* SEGDISP.PAS *)
- (* Routinen zur Abarbeitung von "Segmenten" innerhalb der Grafikserie *)
- (*-------------------------------------------------------------------------*)
- (* Transformationsmatrix fuer ein Segment *)
- (* in Abhaengigkeit v. TransFolge bereitstellen *)
-
- PROCEDURE KonstruiereMat(VAR Mat : tMatrix; Handle : SegNrBereich);
-
- BEGIN
- WITH SegTab[Handle] DO BEGIN
- Einheitsmatrix(Mat);
- CASE Transfolge OF
- 1 : BEGIN
- Rotation(Mat,Drehwinkel);
- Skalierung(Mat,XFaktor,YFaktor);
- Translation(Mat,XPos,YPos);
- END;
- 2 : BEGIN
- Rotation(Mat,Drehwinkel);
- Translation(Mat,XPos,YPos);
- Skalierung(Mat,XFaktor,YFaktor);
- END;
- 3 : BEGIN
- Skalierung(Mat,XFaktor,YFaktor);
- Rotation(Mat,Drehwinkel);
- Translation(Mat,XPos,YPos);
- END;
- 4 : BEGIN
- Skalierung(Mat,XFaktor,YFaktor);
- Translation(Mat,XPos,YPos);
- Rotation(Mat,Drehwinkel);
- END;
- 5 : BEGIN
- Translation(Mat,XPos,YPos);
- Rotation(Mat,Drehwinkel);
- Skalierung(Mat,XFaktor,YFaktor);
- END;
- 6 : BEGIN
- Translation(Mat,XPos,YPos);
- Skalierung(Mat,XFaktor,YFaktor);
- Rotation(Mat,Drehwinkel);
- END;
- END;
- Scherung(Mat,XShear,YShear);
- END
- END;
-
- (*--------------------------------------------------------------------*)
- (* Display-Liste abarbeiten und auf den Bildschirm bringen. *)
-
- PROCEDURE ProcessList(Mat : tMatrix; Zeiger : tDFEintragP);
-
- VAR Vektor1, Vektor2 : tVektor;
- aktX, aktY : REAL; (* Grafikcursor zur Berechnung *)
- (* von relativen Bewegungen. *)
-
- BEGIN
- aktX := 0; aktY := 0;
- WHILE Zeiger^.next <> NIL DO BEGIN
- Vektor1[3] := 1;
- WITH Zeiger^ DO BEGIN
- CASE Kommando OF
- EoDF : ;
- lnew : BEGIN
- Vektor1[1] := x1;
- Vektor1[2] := y1;
- VektorTrans(Vektor1,Mat);
- Vektor2[1] := x2;
- Vektor2[2] := y2;
- Vektor2[3] := 1;
- VektorTrans(Vektor2,Mat);
- linew(Vektor1[1],Vektor1[2],
- Vektor2[1],Vektor2[2]);
- aktX := x2; aktY := y2;
- END;
- pintw : BEGIN
- Vektor1[1] := x;
- Vektor1[2] := y;
- VektorTrans(Vektor1,Mat);
- pointw(Vektor1[1],Vektor1[2]);
- aktX := x; aktY := y;
- END;
- (* Bei Relativbewegungen transformierten Differenzvektor bilden. *)
- mvewr,
- lnewr,
- pintwr : BEGIN
- Vektor1[1] := aktX;
- Vektor1[2] := aktY;
- VektorTrans(Vektor1,Mat);
- Vektor2[1] := aktX + x;
- Vektor2[2] := aktY + y;
- Vektor2[3] := 1;
- VektorTrans(Vektor2,Mat);
- aktX := aktX + x; aktY := aktY + y;
- CASE Kommando OF
- mvewr : movewr(Vektor2[1] - Vektor1[1],
- Vektor2[2] - Vektor1[2]);
- lnewr : linewr(Vektor2[1] - Vektor1[1],
- Vektor2[2] - Vektor1[2]);
- pintwr : pointwr(Vektor2[1] - Vektor1[1],
- Vektor2[2] - Vektor1[2]);
- END;
- END;
- mvewa,
- lnewa : BEGIN
- Vektor1[1] := x;
- Vektor1[2] := y;
- VektorTrans(Vektor1,Mat);
- aktX := x; aktY := y;
- CASE Kommando OF
- mvewa : movewa(Vektor1[1],Vektor1[2]);
- lnewa : linewa(Vektor1[1],Vektor1[2]);
- END;
- END;
- END;
- END;
- Zeiger := Zeiger^.next;
- END;
- END;
-
- (*--------------------------------------------------------------------*)
- (* Segment abarbeiten. *)
- (* Wenn Delete TRUE ist, wird das grafische Objekt mit der Hinter- *)
- (* grundfarbe (Schwarz) uebermalt. *)
-
- PROCEDURE ProcessSeg(Handle : SegNrBereich; Delete : BOOLEAN);
-
- VAR Mat : tMatrix;
- Col : Sys_Colors;
-
- BEGIN
- IF SegTab[Handle].DFP <> NIL (* Illegales Handle ? *) THEN
- IF SegTab[Handle].sichtbar THEN BEGIN
- KonstruiereMat(Mat,Handle);
- Col := Pen_Color;
- IF Delete THEN
- Set_Pen_Color(First_Color_Value);
- ProcessList(Mat,SegTab[Handle].DFP);
- Set_Pen_Color(Col);
- END
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Ende von SEGDISP.PAS *)