home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / draw.inc < prev    next >
Text File  |  1988-02-01  |  5KB  |  144 lines

  1. (*****************************************************************************)
  2. (*                             DRAW.INC                                      *)
  3. (*                                                                           *)
  4. (*              Zeichnen des Graphen von f - CGA-Version                     *)
  5. (*****************************************************************************)
  6.  
  7. Procedure DrawGraph;
  8.  
  9.    Var xmin,xmax,
  10.        ymin,ymax,
  11.        dx,dy,x,d    :Real;
  12.        s            :Integer;
  13.  
  14.  
  15. (* ----- hardwareabhängiger Teil, hier speziell für IBM-Farbgrafikkarte ---- *)
  16. (*                                                                           *)
  17.  
  18.    Const ScreenXMax = 639;   (* Maximalzahl-1  von Bildpunkten in x-Richtung *)
  19.          ScreenYMax = 199;   (*       -         -       -       - y-Richtung *)
  20.          Left       =  20;   (* Abstand linker Rand/Zeichnung in Bildpunkten *)
  21.          Bottom     =  20;   (*    -    unterer       -        -      -      *)
  22.          XTickLen   =   2;   (* Länge  der x-Unterteilungsstriche      -     *)
  23.          YTickLen   =   4;   (* Breite der y-         -                -     *)
  24.  
  25.  
  26.    Procedure EnterGraphicMode;
  27.  
  28.      (* erledigt alle notwendigen Einstellungen zum Grafikbetrieb *)
  29.  
  30.       Begin
  31.       HiRes;
  32.       End;
  33.  
  34.  
  35.    Procedure LeaveGraphicMode;
  36.  
  37.      (* erledigt alle notwendigen Einstellungen zum Textbetrieb *)
  38.  
  39.       Begin
  40.       TextMode;
  41.       End;
  42.  
  43.  
  44.    Procedure Point (x,y :Integer);
  45.  
  46.      (* zeichnet einen Punkt an der Bildschirmkoordinate (x,y); der Ursprung
  47.         des dabei zugrundegelegten Koordinatensystems wird in der linken un-
  48.         teren Ecke des Bildschirms angenommen.                               *)
  49.  
  50.       Begin
  51.       Plot (x,y,1)
  52.       End;
  53.  
  54.  
  55.    Procedure Line (x1,y1,x2,y2 :Integer);
  56.  
  57.      (* verbindet die  Bildschirmkoordinaten (x1,y1) und (x2,y2)  durch eine
  58.         Linie; es gilt das unter "Point" spezifizierte Koordinatensystem.    *)
  59.  
  60.       Begin
  61.       Draw (x1, ScreenYMax-y1, x2, ScreenYMax-y2, 1)
  62.       End;
  63.  
  64. (*                                                                           *)
  65. (* ------------------  Ende des hardwareabhängigen Teils ------------------- *)
  66.  
  67.  
  68.    Procedure WorldToScreen (x,y :Real; Var xs,ys :Integer);
  69.  
  70.      (* rechnet die Weltkoordinaten (x,y) in Schirmkoordinaten (xs,ys) um *)
  71.  
  72.       Begin
  73.       xs := round((x-xmin)*(ScreenXMax-Left)/(xmax-xmin)) + Left;
  74.       ys := round((y-ymin)*(ScreenYMax-Bottom)/(ymax-ymin)) + Bottom
  75.       End;
  76.  
  77.  
  78.    Procedure DrawLine (x1,y1,x2,y2 :Real);
  79.  
  80.      (* zeichnet eine Linie zwischen den Weltkoordinaten (x1,y1) und (x2,y2) *)
  81.  
  82.       Var xp1,yp1,xp2,yp2 :Integer;
  83.  
  84.       Begin
  85.       WorldToScreen (x1, y1, xp1, yp1);
  86.       WorldToScreen (x2, y2, xp2, yp2);
  87.       Line (xp1,yp1,xp2,yp2)
  88.       End;
  89.  
  90.  
  91.    Procedure DrawAxis;
  92.  
  93.      (* zeichnet das Achsenkreuz *)
  94.  
  95.       Var x,y,Dist :Real;
  96.  
  97.       Begin
  98.       Line (Left, Bottom, Left, ScreenYMax);
  99.       Line (Left, Bottom, ScreenXMax, Bottom);
  100.       DrawLine (xmin, 0, xmax, 0);
  101.       DrawLine (0, ymin, 0, ymax);
  102.       dist := dy*(ScreenYMax-Bottom)/(ymax-ymin);  (* Abstand y-Unterteilung *)
  103.       x := Left;
  104.       y := Bottom;
  105.       While y <= ScreenYMax do
  106.          Begin
  107.          Line (round(x-YTickLen), round(y), round(x+YTickLen), round(y));
  108.          y := y + Dist
  109.          End;
  110.       dist := dx*(ScreenXMax-Left)/(xmax-xmin);    (* Abstand x-Unterteilung *)
  111.       x := Left;
  112.       y := Bottom;
  113.       While x <= ScreenXMax do
  114.          Begin
  115.          Line (round(x), round(y-XTickLen), round(x), round(y+XTickLen));
  116.          x := x + Dist
  117.          End;
  118.       End;
  119.  
  120.  
  121.    Begin
  122.    ClrScr;
  123.    WriteLn ('Funktion zeichnen'); WriteLn;
  124.    Write ('im Bereich von xmin='); Read (xmin);
  125.    Write (' bis xmax='); Read (xmax);
  126.    Write (' mit Schrittweite dx='); ReadLn (dx); WriteLn;
  127.    Write ('           von ymin='); Read (ymin);
  128.    Write (' bis ymax='); Read (ymax);
  129.    Write (' mit Schrittweite dy='); ReadLn (dy); WriteLn;
  130.    Write ('Anzahl der zu berechnenden Stützstellen: '); ReadLn (s);
  131.  
  132.    EnterGraphicMode;                                (* Grafik initialisieren *)
  133.    DrawAxis;                                        (* Achsenkreuz zeichnen  *)
  134.    x := xmin;
  135.    d := (xmax-xmin)/s;
  136.    While x+d <= xmax do
  137.       Begin
  138.       DrawLine (x, fn(x,0), x+d, fn(x+d,0));        (* Zeichnen der Funktion *)
  139.       x := x + d
  140.       End;
  141.    Repeat until KeyPressed;
  142.    LeaveGraphicMode
  143.    End;
  144.