home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* CLIPPING.PAS *)
- (* Setzen eines Punktes mit Clipping in Fenstergrenzen *)
-
- PROCEDURE ClipPoint( x, y : REAL);
-
- BEGIN
- WITH Window[AktWin]^ DO
- IF (x >= xmin) AND (x <= xmax) AND (y >= ymin) AND (y <= ymax) THEN
- pointw(x,y)
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Zeichnen einer Linie mit Clipping auf Fenstergrenzen. *)
-
- PROCEDURE ClipLine(x1, y1, x2, y2 : REAL);
-
- TYPE direction = SET OF (left,right,top,bottom);
-
- VAR m, m_inverse : REAL; (* Steigung und reziproke Steigung *)
- x, y : REAL; (* Schnittpunkt mit Windowgrenzen *)
- dir, dir1, dir2 : direction;
-
- PROCEDURE region(x, y : REAL; VAR Endpunkt : direction); (* Wo liegt's ? *)
-
- BEGIN
- Endpunkt := [];
- IF x < Window[AktWin]^.xmin THEN
- Endpunkt := [left]
- ELSE
- IF x > Window[AktWin]^.xmax THEN
- Endpunkt := [right];
- IF y < Window[AktWin]^.ymin THEN
- Endpunkt := Endpunkt + [bottom]
- ELSE
- IF y > Window[AktWin]^.ymax THEN
- Endpunkt := Endpunkt + [top]
- END; (* region *)
-
-
- PROCEDURE clip_left(VAR x, y : REAL); (* Links abschneiden *)
-
- BEGIN
- y := m*(Window[AktWin]^.xmin - x1) + y1;
- x := Window[AktWin]^.xmin
- END;
-
-
- PROCEDURE clip_right(VAR x, y : REAL); (* Rechts abschneiden *)
-
- BEGIN
- y := m*(Window[AktWin]^.xmax - x1) + y1;
- x := Window[AktWin]^.xmax
- END;
-
-
- PROCEDURE clip_top(VAR x, y : REAL); (* Oben abschneiden *)
-
- BEGIN
- x := m_inverse*(Window[AktWin]^.ymax - y1) + x1;
- y := Window[AktWin]^.ymax
- END;
-
-
- PROCEDURE clip_bottom(VAR x, y : REAL); (* Unten abschneiden *)
-
- BEGIN
- x := m_inverse*(Window[AktWin]^.ymin - y1) + x1;
- y := Window[AktWin]^.ymin
- END;
-
-
- BEGIN (* Line-Draw mit Clipping *)
- region(x1,y1,dir1); (* In welchen Bereich liegen die Linienendpunkte ? *)
- region(x2,y2,dir2);
- IF x1 <> x2 THEN
- m := (y2 - y1)/(x2 - x1);
- IF y1 <> y2 THEN
- m_inverse := (x2-x1)/(y2-y1);
- WHILE (dir1 <> []) OR (dir2 <> []) DO BEGIN
- IF dir1*dir2 <> [] THEN (* Linie ausserhalb des Windows *)
- Exit;
- IF dir1 = [] THEN BEGIN (* P1 innerhalb des Windows, P2 clippen *)
- dir := dir2;
- x := x2;
- y := y2
- END
- ELSE BEGIN
- dir := dir1; (* P1 clippen *)
- x := x1;
- y := y1
- END;
- IF left IN dir THEN
- clip_left(x,y)
- ELSE
- IF right IN dir THEN
- clip_right(x,y)
- ELSE
- IF bottom IN dir THEN
- clip_bottom(x,y)
- ELSE
- IF top IN dir THEN
- clip_top(x,y);
- IF dir = dir1 THEN BEGIN
- x1 := x;
- y1 := y;
- region(x1,y1,dir1)
- END
- ELSE BEGIN
- x2 := x;
- y2 := y;
- region(x2,y2,dir2)
- END
- END;
-
- linew(x1,y1,x2,y2)
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Ende CLIPPING.PAS *)