home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / intdda.pas < prev    next >
Pascal/Delphi Source File  |  1987-03-13  |  4KB  |  97 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                             INTDDA.PAS                                  *)
  3. (* Integer-DDA (Digitaler Differential Analysierer) zum Linienziehen fuer  *)
  4. (* die Graphikserie. Arbeitet in Systemkoordinaten mit 'Point_System'.     *)
  5. (* Aus diesem Grund werden die Koordinaten in der Prozedur 'line' ent-     *)
  6. (* sprechend umgerechnet. Ueberpruefung der Koord. geschieht in der        *)
  7. (* Prozedur 'line' durch Verwendung der entsprechenden Typen.              *)
  8. (*-------------------------------------------------------------------------*)
  9.  
  10. PROCEDURE do_line (x1, y1, x2, y2: INTEGER);
  11.  
  12. VAR delta_x, delta_y,                    (* Differenzen Anfangs-..Endpunkt *)
  13.     Zaehler,                             (* Zaehler fuer die Punkte        *)
  14.     Abweichung,                          (* Abweichung von der Linie       *)
  15.     x, y              : INTEGER;         (* Plot-Koordinaten               *)
  16.  
  17. BEGIN                                                   (* Initialisierung *)
  18.   Abweichung := 0;
  19.   delta_x := x2 - x1;
  20.   delta_y := y2 - y1;
  21.   IF delta_y < 0 THEN  (* Anfangs- und Endpunkte muessen vertauscht werden *)
  22.   BEGIN
  23.     point_swap(x1, y1, x2, y2);
  24.     delta_y := -delta_y;                    (* Die Differenzen wechseln    *)
  25.     delta_x := -delta_x;                    (* entsprechend das Vorzeichen *)
  26.   END;
  27.   Point_System(x1, y1);                             (* Ersten Punkt setzen *)
  28.   x := x1;                                       (* x und y initialisieren *)
  29.   y := y1;
  30.   IF delta_x >= 0 THEN               (* Steigung positiv ==> Fall 1 oder 2 *)
  31.     IF delta_x < delta_y THEN        (* Steigung > 1 ==> Fall 1            *)
  32.       FOR Zaehler := 1 TO Pred(delta_y) DO
  33.         IF Abweichung < 0 THEN
  34.           BEGIN
  35.             x := Succ(x);
  36.             y := Succ(y);
  37.             Point_System(x, y);
  38.             Abweichung := Abweichung + delta_y - delta_x;
  39.           END
  40.         ELSE
  41.           BEGIN                                         (* Abweichung >= 0 *)
  42.             y := Succ(y);
  43.             Point_System(x, y);
  44.             Abweichung := Abweichung - delta_x;
  45.           END
  46.     ELSE                                  (* 0 <= Steigung <= 1 ==> Fall 2 *)
  47.       FOR Zaehler := 1 TO Pred(delta_x) DO
  48.         IF Abweichung <= 0 THEN
  49.           BEGIN
  50.             x := Succ(x);
  51.             Point_System(x, y);
  52.             Abweichung := Abweichung + delta_y;
  53.           END
  54.         ELSE
  55.           BEGIN                                          (* Abweichung > 0 *)
  56.             x := Succ(x);
  57.             y := Succ(y);
  58.             Point_System(x, y);
  59.             Abweichung := Abweichung + delta_y - delta_x;
  60.           END
  61.   ELSE                                             (* ==> Steigung negativ *)
  62.     IF abs(delta_x) >= delta_y THEN       (* 0 > Steigung >= -1 ==> Fall 3 *)
  63.       FOR Zaehler := 1 TO Pred(abs(delta_x)) DO
  64.         IF Abweichung <= 0 THEN
  65.           BEGIN
  66.             x := Pred(x);
  67.             Point_System(x, y);
  68.             Abweichung := Abweichung + delta_y;
  69.           END
  70.         ELSE
  71.           BEGIN
  72.             x := Pred(x);
  73.             y := Succ(y);
  74.             Point_System(x, y);
  75.             Abweichung := Abweichung + delta_x + delta_y;
  76.           END
  77.   ELSE                                         (* Steigung < -1 ==> Fall 4 *)
  78.     FOR Zaehler := 1 TO Pred(delta_y) DO
  79.       IF Abweichung < 0 THEN
  80.         BEGIN
  81.           x := Pred(x);
  82.           y := Succ(y);
  83.           Point_System(x, y);
  84.           Abweichung := Abweichung + delta_x + delta_y;
  85.         END
  86.       ELSE
  87.         BEGIN
  88.           y := Succ(y);
  89.           Point_System(x, y);
  90.           Abweichung := Abweichung + delta_x;
  91.         END;
  92.   Point_System(x2, y2)                             (* letzten Punkt setzen *)
  93. END;
  94.  
  95. (*-------------------------------------------------------------------------*)
  96. (*                           Ende von INTDDA.PAS                           *)
  97.