home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
clipline.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-05-18
|
3KB
|
110 lines
(*-------------------------------------------------------------------------*)
(* CLIPLINE.PAS *)
(* 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 CLIPLINE.PAS *)