(*********************************************************) FUNCTION rd(x:real):integer; VAR si: integer; BEGIN si:=1; IF x<0 THEN si:=-1; IF abs(x)>3e4 THEN rd:=si*30000 ELSE rd:=round(x); END; (*********************************************************) PROCEDURE pl( x,y:real; farbe:integer); (* GLOBAL xmin,xmax,ymin,ymax, keine und FUNCTION rd *) VAR xi, yi :integer; BEGIN xi :=rd(xg/(xmax-xmin)*(x-xmin)); yi :=rd(yg/(ymin-ymax)*(y-ymax)); IF farbe<>keine THEN LineTo(xi,yi) else MoveTo(xi,yi); END; (*********************************************************) PROCEDURE kreuz( x,y:real; l:integer); (* GLOBAL xmin,xmax,ymin,ymax und FUNCTION rd *) VAR xi, yi :integer; BEGIN xi :=rd(xg/(xmax-xmin)*(x-xmin)); yi :=rd(yg/(ymin-ymax)*(y-ymax)); Line(xi-l,yi,xi+l,yi); Line(xi,yi-l,xi,yi+l); END; (*********************************************************) PROCEDURE plotbegin(VAR xg,yg,xt,yt,farbe,keine :integer); (* xt, yt werden in Turbo Pascal 6 nicht mehr gebraucht, sie sind nur aus Kompatibilitaetsgruenden noch vorhanden *) VAR Driver,Mode,err:INTEGER; BEGIN Driver:=Detect; InitGraph(Driver,Mode,'c:\tp\bgi'); (* Hier muss der Pfadname zu den bgi Files angegeben werden *) err:=Graphresult; IF err<>0 THEN BEGIN WriteLn('der Fehler ist : ',err); HALT; END; (* Breite und Hoehe des Grafikschirms: *) xg :=GetMaxX; yg:=GetMaxY; keine := black; farbe := white; SetColor(farbe); (* Zeichenfarbe *) SetBkColor(black); (* Hintergrundfarbe *) SetTextStyle(DefaultFont, HorizDir,1); (* Schriftwahl *) END; (*********************************************************) PROCEDURE achsen(xmin,xmax,ymin,ymax:real; xg,yg,xt,yt,farbe,keine:integer); VAR i,k,ex,ey,xi,yi : integer; ox,oy, mx,my: real; hstri, stri: string[50] ; FUNCTION zehnhoch(e:integer):real; BEGIN zehnhoch:=exp(e*ln(10)) END; PROCEDURE pl( x,y:real; farbe:integer); (* GLOBAL xmin,xmax,ymin,ymax, keine und FUNCTION rd *) VAR xi, yi :integer; BEGIN xi :=rd(xg/(xmax-xmin)*(x-xmin)); yi :=rd(yg/(ymin-ymax)*(y-ymax)); IF farbe<>keine THEN LineTo(xi,yi) else MoveTo(xi,yi); END; PROCEDURE tick(x,y:real; ch:char); (* Produziert die Tick-marks auf Achsen *) VAR xi,yi :integer; BEGIN xi :=round(xg/(xmax-xmin)*(x-xmin)); yi :=round(yg/(ymin-ymax)*(y-ymax)); CASE ch OF 'x','v' : (*auf x-Achse*) begin Line(xi,yi+3,xi,yi-3); (* ist Platz fuer Beschriftung unten ? *) if yi + 3 + TextHeight('A') <= yg then MoveTo(xi,yi+3+TextHeight('A')) else MoveTo(xi,yi-3-TextHeight('A')) end; 'y','h' : (*auf y-Achse*) begin Line(xi-3,yi,xi+3,yi); (* ist Platz fuer Beschriftung links ? *) if xi - 3 - TextWidth('-AA') >0 then MoveTo(xi - 3 - TextWidth('-AA'),yi) else MoveTo(xi+ 6,yi) end; END END; PROCEDURE zerlege(x:real;VAR mantisse:real;VAR exponent:integer); (* zerlegt eine real Zahl in Mantisse und Exponent *) VAR e :integer; BEGIN e := trunc(ln(x)/ln(10)); x := x/exp(e*ln(10)); (*anpassen *) IF (x<1) THEN BEGIN x:=x*10; e:=e-1 END; IF x>10 THEN BEGIN x:= x/10 ; e := e+1 END; exponent:=e; mantisse:=x; END; FUNCTION skala(a,b:real):integer; (* bestimmt eine einen integer Skalenschritt fr die Tickmarks *) VAR k : real; h : integer; BEGIN k := 1; WHILE (b-a) / k >= 10 DO k := k*10; WHILE (b-a) / k < 5 DO k := k/ 2; IF k>1 THEN h:= round(k) ELSE h:=1; if h=13 then h := 10; if h=3 then h := 2; skala := h; END; BEGIN ox:=0; oy:=0; (* Nullpunktverschiebung *) IF xmin>0 THEN BEGIN zerlege(xmax,my,ey); ey:=ey-1; my:=my*10; ox := round(xmin*zehnhoch(-ey))*zehnhoch(ey); (* Korrektur, falls ox auuserhalb des Intervalls liegt *) if ox > xmax then ox := xmax else if ox < xmin then ox := xmin; END else IF xmax<0 THEN begin zerlege(-xmin,my,ey); ey :=ey-1; my := my*10; ox:=-round(-xmax*zehnhoch(-ey))*zehnhoch(ey); if ox < xmin then ox := xmin else if ox>xmax then ox := xmax end; xmax := xmax -ox; xmin := xmin -ox; IF ymin>0 THEN BEGIN zerlege(ymax,my,ey); ey := ey-1; my := my*10; oy:= round(ymin*zehnhoch(-ey))*zehnhoch(ey); if oy>ymax then oy := ymax else if oyymax then oy := ymax end; ymax := ymax -oy; ymin := ymin -oy; (* Skalierung *) zerlege(xmax-xmin,mx,ex); zerlege(ymax-ymin,my,ey); ex:=ex-1; ey:=ey-1; xmax:=xmax*zehnhoch(-ex); xmin:=xmin*zehnhoch(-ex); ymax:=ymax*zehnhoch(-ey); ymin:=ymin*zehnhoch(-ey); (* x-Achse*) pl(xmin,0,keine); pl(xmax,0,farbe); k := skala(xmin,xmax); FOR i := round(xmin) TO round(xmax) DO BEGIN IF i MOD k = 0 THEN BEGIN tick(i,0,'x'); Str(i,stri); IF i>0 THEN stri:=' '+stri; SetTextJustify(CenterText, TopText); OutText(stri); END; END; (*y-Achse *) pl(0,ymin,keine); pl(0,ymax,farbe); k := skala(ymin,ymax); FOR i := round(ymin) TO round(ymax) DO BEGIN IF i MOD k = 0 THEN BEGIN tick(0,i,'y'); Str(i,stri); IF i>0 THEN stri:=' '+stri; SetTextJustify(LeftText, CenterText); OutText(stri); END; END; (* Einheiten beschriften *) IF ox<>0 THEN begin Str(ox:12,stri); hstri := stri+'+ x' end else hstri :=''; IF ex<>0 THEN begin if ox=0 then hstri := hstri+'x'; Str(ex,stri); hstri := hstri + '*10^'+stri; end; SetTextJustify(LeftText, CenterText); OutTextXY(xg-TextWidth(hstri),yg-4*TextHeight(hstri),hstri); IF oy<>0 THEN begin Str(oy:12,stri); hstri := stri+'+ y' end else hstri :=''; IF ey<>0 THEN begin if oy=0 then hstri := hstri+'y'; Str(ey,stri); hstri := hstri + '*10^'+stri; end; SetTextJustify(LeftText, CenterText); OutTextXY(xg-TextWidth(hstri),yg-2*TextHeight(hstri),hstri); END;