home *** CD-ROM | disk | FTP | other *** search
- (*****************************************************************************)
- (* *)
- (* --- DRAW.INC --- *)
- (* *)
- (* Unterprogramm-Modul zum Zeichnen der Funktion *)
- (* *)
- (*****************************************************************************)
-
-
- Procedure PlotFunction;
-
-
- Var xmin,xmax,
- ymin,ymax,
- dx,dy,x,d :Real;
- s :Integer;
-
-
- (* Hier beginnt der hardwareabhaengige Teil *)
-
- Const ScreenXMax = MaxInt; (* Anzahl Bildpunkte horizontal *)
- ScreenYMax = MaxInt; (* vertikal *)
- Left = 500; (* Abstand Zeichenflaeche-linker Bildschirmrand *)
- Bottom = 500; (* -unterer *)
- Unit = 200; (* halbe Breite der Achsenunterteilungsstriche *)
-
-
- Procedure InitGraphic; (* Voreinstellungen fuer Grafikbetrieb *)
-
- Begin
- Open_Workstation(Screen);
- IF VDI_Error THEN Halt;
- Enter_Graphics;
- End;
-
-
- Procedure LeaveGraphic; (* Voreinstellungen fuer Textbetrieb *)
-
- Begin
- Close_Workstation;
- End;
-
-
- Procedure Plot (x,y :Integer); (* Punkt bei (x,y) zeichnen *)
-
- Begin
- ptsin[1] := x; ptsin[2] := y; ptsin[3] := x; ptsin[4] := y;
- Poly_Line(2, ptsin);
- End;
-
-
- Procedure Draw (x1,y1,x2,y2 :Integer); (* Linie von (x1,y1) nach (x2,y2) *)
-
- Begin
- ptsin[1] := x1; ptsin[2] := y1; ptsin[3] := x2; ptsin[4] := y2;
- Poly_Line(2, ptsin);
- 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;