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

  1. (*****************************************************************************)
  2. (*                            DRAW2.INC                                      *)
  3. (*                                                                           *)
  4. (*               Unterprogramm-Modul zum Zeichnen der Funktion               *)
  5. (*                   Speziell Schneider CPC 6128                             *)
  6. (*****************************************************************************)
  7.  
  8.  
  9. Procedure PlotFunction;
  10.  
  11.  
  12.    Var xmin,xmax,
  13.        ymin,ymax,
  14.        dx,dy,x,d  :Real;
  15.        s          :Integer;
  16.  
  17.  
  18.    (* Hier beginnt der hardwareabhaengige Teil *)
  19.  
  20.    Const ScreenXMax = 639;  (* Anzahl Bildpunkte horizontal                 *)
  21.          ScreenYMax = 399;  (*                   vertikal                   *)
  22.          Left       =  16;  (* Abstand Zeichenflaeche-linker Bildschirmrand *)
  23.          Bottom     =  16;  (*                       -unterer               *)
  24.          Unit       =   4;  (* halbe Breite der Achsenunterteilungsstriche  *)
  25.  
  26.  
  27.    Procedure InitGraphic;     (* Voreinstellungen fuer Grafikbetrieb *)
  28.  
  29.       Begin
  30.       ClrScr;
  31.       Write (#27'0')
  32.       End;
  33.  
  34.  
  35.    Procedure LeaveGraphic;    (* Voreinstellungen fuer Textbetrieb *)
  36.  
  37.       Begin
  38.       ClrScr;
  39.       Write (#27'1')
  40.       End;
  41.  
  42.  
  43.    Procedure Plot (x,y :Integer);    (* Punkt bei (x,y) zeichnen *)
  44.  
  45.        Begin
  46.        Inline ($2A/x/$EB/$2A/y/$CD/$10/$Fd/$EA/$BB)
  47.        End;
  48.  
  49.  
  50.    Procedure Draw (x1,y1,x2,y2 :Integer);  (* Linie von (x1,y1) nach (x2,y2) *)
  51.  
  52.       Begin
  53.       Plot (x1,y1);
  54.       Inline ($2A/x2/$EB/$2A/y2/$CD/$5A/$FC/$F6/$BB)
  55.       End;
  56.  
  57.    (* hier endet der hardwareabhaengige Teil *)
  58.  
  59.  
  60.    Procedure WorldToScreen (x,y :Real; Var xs,ys :Integer);
  61.  
  62.       Begin
  63.       xs := round((x - xmin)*(ScreenXMax-Left)/(xmax-xmin)) + Left;
  64.       ys := round((y - ymin)*(ScreenYMax-Bottom)/(ymax-ymin)) + Bottom
  65.       End;
  66.  
  67.  
  68.    Procedure DrawPoint (x,y :Real);    (* zeichnet Punkt in Weltkoordinaten *)
  69.  
  70.       Var xp,yp :Integer;
  71.  
  72.       Begin
  73.       WorldToScreen (x,y,xp,yp);
  74.       Plot (xp,yp)
  75.       End;
  76.  
  77.  
  78.    Procedure DrawLine (x1,y1,x2,y2 :Real); (* zeichnet Linie in Weltkoordinaten *)
  79.  
  80.       Var xp1,yp1,xp2,yp2 :Integer;
  81.  
  82.       Begin
  83.       WorldToScreen (x1,y1,xp1,yp1);
  84.       WorldToScreen (x2,y2,xp2,yp2);
  85.       Draw (xp1,yp1,xp2,yp2)
  86.       End;
  87.  
  88.  
  89.    Procedure DrawAxis;   (* zeichnet das Achsenkreuz *)
  90.  
  91.       Var x,y,Dist :Real;
  92.  
  93.       Begin
  94.       Draw (Left,Bottom,Left,ScreenYMax);
  95.       Draw (Left,Bottom,ScreenXMax,Bottom);
  96.       DrawLine (xmin,0,xmax,0);
  97.       DrawLine (0,ymin,0,ymax);
  98.  
  99.       dist := dy*(ScreenYMax-Bottom)/(ymax-ymin); (* Abstand y-Unterteilung *)
  100.       x := Left;
  101.       y := Bottom;
  102.       While y<=ScreenYMax do
  103.          Begin
  104.          Draw (round(x-Unit),round(y),round(x+Unit),round(y));
  105.          y := y + Dist
  106.          End;
  107.  
  108.       dist := dx*(ScreenXMax-Left)/(xmax-xmin);   (* Abstand y-Unterteilung *)
  109.       x := Left;
  110.       y := Bottom;
  111.       While x<=ScreenXMax do
  112.          Begin
  113.          Draw (round(x),round(y-Unit),round(x),round(y+Unit));
  114.          x := x + Dist
  115.          End;
  116.       End;
  117.  
  118.  
  119.    Begin
  120.    ClrScr;
  121.    WriteLn ('Funktion zeichnen'); WriteLn;
  122.    Write ('im Bereich von xmin='); Read (xmin);
  123.    Write (' bis xmax='); Read (xmax);
  124.    Write (' mit Schrittweite dx='); ReadLn (dx); WriteLn;
  125.    Write ('           von ymin='); Read (ymin);
  126.    Write (' bis ymax='); Read (ymax);
  127.    Write (' mit Schrittweite dy='); ReadLn (dy); WriteLn;
  128.    Write ('Anzahl der zu berechnenden Stuetzstellen: '); ReadLn (s);
  129.  
  130.    InitGraphic;                               (* Grafik initialisieren *)
  131.    DrawAxis;                                  (* Achsenkreuz zeichnen  *)
  132.    x := xmin;
  133.    d := (xmax-xmin)/s;
  134.    While x+d<=xmax do
  135.       Begin
  136.       DrawLine (x,fn(x,0),x+d,fn(x+d,0));     (* Zeichnen der Funktion *)
  137.       x := x + d
  138.       End;
  139.    Repeat until KeyPressed;
  140.    LeaveGraphic
  141.    End;
  142.