home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* 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 *)