home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
intdda.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-03-13
|
4KB
|
97 lines
(*-------------------------------------------------------------------------*)
(* INTDDA.PAS *)
(* Integer-DDA (Digitaler Differential Analysierer) zum Linienziehen fuer *)
(* die Graphikserie. Arbeitet in Systemkoordinaten mit 'Point_System'. *)
(* Aus diesem Grund werden die Koordinaten in der Prozedur 'line' ent- *)
(* sprechend umgerechnet. Ueberpruefung der Koord. geschieht in der *)
(* Prozedur 'line' durch Verwendung der entsprechenden Typen. *)
(*-------------------------------------------------------------------------*)
PROCEDURE do_line (x1, y1, x2, y2: INTEGER);
VAR delta_x, delta_y, (* Differenzen Anfangs-..Endpunkt *)
Zaehler, (* Zaehler fuer die Punkte *)
Abweichung, (* Abweichung von der Linie *)
x, y : INTEGER; (* Plot-Koordinaten *)
BEGIN (* Initialisierung *)
Abweichung := 0;
delta_x := x2 - x1;
delta_y := y2 - y1;
IF delta_y < 0 THEN (* Anfangs- und Endpunkte muessen vertauscht werden *)
BEGIN
point_swap(x1, y1, x2, y2);
delta_y := -delta_y; (* Die Differenzen wechseln *)
delta_x := -delta_x; (* entsprechend das Vorzeichen *)
END;
Point_System(x1, y1); (* Ersten Punkt setzen *)
x := x1; (* x und y initialisieren *)
y := y1;
IF delta_x >= 0 THEN (* Steigung positiv ==> Fall 1 oder 2 *)
IF delta_x < delta_y THEN (* Steigung > 1 ==> Fall 1 *)
FOR Zaehler := 1 TO Pred(delta_y) DO
IF Abweichung < 0 THEN
BEGIN
x := Succ(x);
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung + delta_y - delta_x;
END
ELSE
BEGIN (* Abweichung >= 0 *)
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung - delta_x;
END
ELSE (* 0 <= Steigung <= 1 ==> Fall 2 *)
FOR Zaehler := 1 TO Pred(delta_x) DO
IF Abweichung <= 0 THEN
BEGIN
x := Succ(x);
Point_System(x, y);
Abweichung := Abweichung + delta_y;
END
ELSE
BEGIN (* Abweichung > 0 *)
x := Succ(x);
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung + delta_y - delta_x;
END
ELSE (* ==> Steigung negativ *)
IF abs(delta_x) >= delta_y THEN (* 0 > Steigung >= -1 ==> Fall 3 *)
FOR Zaehler := 1 TO Pred(abs(delta_x)) DO
IF Abweichung <= 0 THEN
BEGIN
x := Pred(x);
Point_System(x, y);
Abweichung := Abweichung + delta_y;
END
ELSE
BEGIN
x := Pred(x);
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung + delta_x + delta_y;
END
ELSE (* Steigung < -1 ==> Fall 4 *)
FOR Zaehler := 1 TO Pred(delta_y) DO
IF Abweichung < 0 THEN
BEGIN
x := Pred(x);
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung + delta_x + delta_y;
END
ELSE
BEGIN
y := Succ(y);
Point_System(x, y);
Abweichung := Abweichung + delta_x;
END;
Point_System(x2, y2) (* letzten Punkt setzen *)
END;
(*-------------------------------------------------------------------------*)
(* Ende von INTDDA.PAS *)