home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
draw2.inc
< prev
next >
Wrap
Text File
|
1988-02-02
|
4KB
|
142 lines
(*****************************************************************************)
(* DRAW2.INC *)
(* *)
(* Unterprogramm-Modul zum Zeichnen der Funktion *)
(* Speziell Schneider CPC 6128 *)
(*****************************************************************************)
Procedure PlotFunction;
Var xmin,xmax,
ymin,ymax,
dx,dy,x,d :Real;
s :Integer;
(* Hier beginnt der hardwareabhaengige Teil *)
Const ScreenXMax = 639; (* Anzahl Bildpunkte horizontal *)
ScreenYMax = 399; (* vertikal *)
Left = 16; (* Abstand Zeichenflaeche-linker Bildschirmrand *)
Bottom = 16; (* -unterer *)
Unit = 4; (* halbe Breite der Achsenunterteilungsstriche *)
Procedure InitGraphic; (* Voreinstellungen fuer Grafikbetrieb *)
Begin
ClrScr;
Write (#27'0')
End;
Procedure LeaveGraphic; (* Voreinstellungen fuer Textbetrieb *)
Begin
ClrScr;
Write (#27'1')
End;
Procedure Plot (x,y :Integer); (* Punkt bei (x,y) zeichnen *)
Begin
Inline ($2A/x/$EB/$2A/y/$CD/$10/$Fd/$EA/$BB)
End;
Procedure Draw (x1,y1,x2,y2 :Integer); (* Linie von (x1,y1) nach (x2,y2) *)
Begin
Plot (x1,y1);
Inline ($2A/x2/$EB/$2A/y2/$CD/$5A/$FC/$F6/$BB)
End;
(* hier endet der hardwareabhaengige Teil *)
Procedure WorldToScreen (x,y :Real; Var xs,ys :Integer);
Begin
xs := round((x - xmin)*(ScreenXMax-Left)/(xmax-xmin)) + Left;
ys := round((y - ymin)*(ScreenYMax-Bottom)/(ymax-ymin)) + Bottom
End;
Procedure DrawPoint (x,y :Real); (* zeichnet Punkt in Weltkoordinaten *)
Var xp,yp :Integer;
Begin
WorldToScreen (x,y,xp,yp);
Plot (xp,yp)
End;
Procedure DrawLine (x1,y1,x2,y2 :Real); (* zeichnet Linie in Weltkoordinaten *)
Var xp1,yp1,xp2,yp2 :Integer;
Begin
WorldToScreen (x1,y1,xp1,yp1);
WorldToScreen (x2,y2,xp2,yp2);
Draw (xp1,yp1,xp2,yp2)
End;
Procedure DrawAxis; (* zeichnet das Achsenkreuz *)
Var x,y,Dist :Real;
Begin
Draw (Left,Bottom,Left,ScreenYMax);
Draw (Left,Bottom,ScreenXMax,Bottom);
DrawLine (xmin,0,xmax,0);
DrawLine (0,ymin,0,ymax);
dist := dy*(ScreenYMax-Bottom)/(ymax-ymin); (* Abstand y-Unterteilung *)
x := Left;
y := Bottom;
While y<=ScreenYMax do
Begin
Draw (round(x-Unit),round(y),round(x+Unit),round(y));
y := y + Dist
End;
dist := dx*(ScreenXMax-Left)/(xmax-xmin); (* Abstand y-Unterteilung *)
x := Left;
y := Bottom;
While x<=ScreenXMax do
Begin
Draw (round(x),round(y-Unit),round(x),round(y+Unit));
x := x + Dist
End;
End;
Begin
ClrScr;
WriteLn ('Funktion zeichnen'); WriteLn;
Write ('im Bereich von xmin='); Read (xmin);
Write (' bis xmax='); Read (xmax);
Write (' mit Schrittweite dx='); ReadLn (dx); WriteLn;
Write (' von ymin='); Read (ymin);
Write (' bis ymax='); Read (ymax);
Write (' mit Schrittweite dy='); ReadLn (dy); WriteLn;
Write ('Anzahl der zu berechnenden Stuetzstellen: '); ReadLn (s);
InitGraphic; (* Grafik initialisieren *)
DrawAxis; (* Achsenkreuz zeichnen *)
x := xmin;
d := (xmax-xmin)/s;
While x+d<=xmax do
Begin
DrawLine (x,fn(x,0),x+d,fn(x+d,0)); (* Zeichnen der Funktion *)
x := x + d
End;
Repeat until KeyPressed;
LeaveGraphic
End;