home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 04 / quellen / draw.inc < prev    next >
Encoding:
Text File  |  1988-10-10  |  5.5 KB  |  198 lines

  1. (*****************************************************************************)
  2. (*                             DRAW.INC                                      *)
  3. (*                                                                           *)
  4. (*              Zeichnen des Graphen von f - CGA-Version                     *)
  5. (*****************************************************************************)
  6.  
  7. Procedure PlotFunction;
  8.  
  9.    Var xmin,xmax,
  10.        ymin,ymax,
  11.        dx,dy,x,d,
  12.        s1,f1,f2     :Real;
  13.        s,grad,i,j   :Integer;
  14.        key          :CHAR;
  15.        ok           :BOOLEAN;
  16.  
  17.  
  18. (* ----- hardwareabhaengiger Teil, hier speziell fuer IBM-Farbgrafikkarte -- *)
  19. (*                                                                           *)
  20.  
  21.    Const ScreenXMax = 639;   (* Maximalzahl-1  von Bildpunkten in x-Richtung *)
  22.          ScreenYMax = 199;   (*       -         -       -       - y-Richtung *)
  23.          Left       =  20;   (* Abstand linker Rand/Zeichnung in Bildpunkten *)
  24.          Bottom     =  20;   (*    -    unterer       -        -      -      *)
  25.          XTickLen   =   2;   (* Laenge  der x-Unterteilungsstriche     -     *)
  26.          YTickLen   =   4;   (* Breite der y-         -                -     *)
  27.  
  28.  
  29.    Procedure InitGraphic;
  30.  
  31.      (* erledigt alle notwendigen Einstellungen zum Grafikbetrieb *)
  32.  
  33.       Begin
  34.       HiRes;
  35.       End;
  36.  
  37.  
  38.    Procedure LeaveGraphic;
  39.  
  40.      (* erledigt alle notwendigen Einstellungen zum Textbetrieb *)
  41.  
  42.       Begin
  43.       TextMode;
  44.       End;
  45.  
  46.  
  47.    Procedure Point (x,y :Integer);
  48.  
  49.      (* zeichnet einen Punkt an der Bildschirmkoordinate (x,y); der Ursprung
  50.         des dabei zugrundegelegten Koordinatensystems wird in der linken un-
  51.         teren Ecke des Bildschirms angenommen.                               *)
  52.  
  53.       Begin
  54.       Plot (x,y,1)
  55.       End;
  56.  
  57.  
  58.    Procedure Line (x1,y1,x2,y2 :Integer);
  59.  
  60.      (* verbindet die  Bildschirmkoordinaten (x1,y1) und (x2,y2)  durch eine
  61.         Linie; es gilt das unter "Point" spezifizierte Koordinatensystem.    *)
  62.  
  63.       Begin
  64.       Draw (x1, ScreenYMax-y1, x2, ScreenYMax-y2, 1)
  65.       End;
  66.  
  67. (*                                                                           *)
  68. (* ------------------  Ende des hardwareabhaengigen Teils ------------------ *)
  69.  
  70.  
  71.   PROCEDURE worldtoscreen (x,y :REAL; VAR xs,ys :INTEGER);
  72.  
  73.   VAR a,b : REAL;
  74.  
  75.   BEGIN
  76.     a := (x - xmin)*(screenxmax-left)/(xmax-xmin);
  77.     b := (y - ymin)*(screenymax-bottom)/(ymax-ymin);
  78.     IF Abs(a) > 32000.0
  79.       THEN
  80.         a := sign(a)*32000.0;
  81.     IF Abs(b) > 32000.0
  82.       THEN
  83.         b := sign(b)*32000.0;
  84.     xs := Round(a) + left;
  85.     ys := Round(b) + bottom;
  86.     if ys < bottom then ys := bottom;
  87.   END;
  88.  
  89.  
  90.  
  91.    Procedure DrawLine (x1,y1,x2,y2 :Real);
  92.  
  93.      (* zeichnet eine Linie zwischen den Weltkoordinaten (x1,y1) und (x2,y2) *)
  94.  
  95.       Var xp1,yp1,xp2,yp2 :Integer;
  96.  
  97.       Begin
  98.       WorldToScreen (x1, y1, xp1, yp1);
  99.       WorldToScreen (x2, y2, xp2, yp2);
  100.       Line (xp1,yp1,xp2,yp2)
  101.       End;
  102.  
  103.  
  104.    Procedure DrawAxis;
  105.  
  106.      (* zeichnet das Achsenkreuz *)
  107.  
  108.       Var x,y,Dist :Real;
  109.  
  110.       Begin
  111.       Line (Left, Bottom, Left, ScreenYMax);
  112.       Line (Left, Bottom, ScreenXMax, Bottom);
  113.       DrawLine (xmin, 0, xmax, 0);
  114.       DrawLine (0, ymin, 0, ymax);
  115.       dist := dy*(ScreenYMax-Bottom)/(ymax-ymin);  (* Abstand y-Unterteilung *)
  116.       x := Left;
  117.       y := Bottom;
  118.       While y <= ScreenYMax do
  119.          Begin
  120.          Line (round(x-YTickLen), round(y), round(x+YTickLen), round(y));
  121.          y := y + Dist
  122.          End;
  123.       dist := dx*(ScreenXMax-Left)/(xmax-xmin);    (* Abstand x-Unterteilung *)
  124.       x := Left;
  125.       y := Bottom;
  126.       While x <= ScreenXMax do
  127.          Begin
  128.          Line (round(x), round(y-XTickLen), round(x), round(y+XTickLen));
  129.          x := x + Dist
  130.          End;
  131.       End;
  132.  
  133.  
  134. BEGIN
  135.   Clrscr;
  136.   Writeln ('Funktion zeichnen');
  137.   REPEAT
  138.     Writeln;
  139.     formulaln (xmin,'im Bereich von xmin = ');
  140.     formulaln (xmax,'           bis xmax = ');
  141.   UNTIL xmin < xmax;
  142.   REPEAT
  143.     formulaln (dx, 'mit Schrittweite dx = ');
  144.   UNTIL dx > 0.0;
  145.   REPEAT
  146.     Writeln;
  147.     formulaln (ymin,'           von ymin = ');
  148.     formulaln (ymax,'           bis ymax = ');
  149.   UNTIL ymin < ymax;
  150.   REPEAT
  151.     formulaln (dy, ' mit Schrittweite dy = ');
  152.   UNTIL dy > 0.0;
  153.   Writeln;
  154.   REPEAT
  155.     formulaln (s1,'Anzahl der zu berechnenden Stuetzstellen : ');
  156.     s := Round(s1);
  157.   UNTIL s >= 0;
  158.   if s = 0 THEN s := screenxmax-left;
  159.   Writeln;
  160.   Writeln('Welche Funktion soll gezeichnet werden ?');
  161.   Writeln;
  162.   for i := 0 to maxgrad do
  163.   BEGIN
  164.     Write('         f');
  165.     for j := 1 to i do Write('''');
  166.     Write('':maxgrad-i, '  : ',i:3);
  167.     WriteLn
  168.   END;
  169.   Writeln;
  170.   Write('Bitte waehlen :   ');
  171.   REPEAT
  172.     Read(kbd,key);
  173.   UNTIL key in ['0'..chr(maxgrad+ord('0'))];
  174.   grad := ord(key) - ord('0');
  175.   initgraphic;                               (* Grafik initialisieren *)
  176.   drawaxis;                                  (* Achsenkreuz zeichnen  *)
  177.   x := xmin;
  178.   d := (xmax-xmin)/s;
  179.   f1 := fn(x,grad);
  180.   ok := calcresult;
  181.   f2 := fn(x+d,grad);
  182.   ok := ok AND calcresult;
  183.   WHILE (x+d<=xmax) AND NOT Keypressed DO
  184.     BEGIN
  185.       IF ok
  186.         THEN
  187.           drawline (x,f1,x+d,f2);     (* Zeichnen der Funktion *)
  188.       x := x + d;
  189.       f1 := fn(x,grad);
  190.       ok := calcresult;
  191.       f2 := fn(x+d,grad);
  192.       ok := ok AND calcresult;
  193.     END;
  194.   REPEAT UNTIL keypressed;
  195.   leavegraphic
  196. END;
  197.  
  198.