| Autor |
Beitrag |
Mastereye
Hält's aus hier
Beiträge: 6
D7
|
Verfasst: Fr 05.11.04 15:36
Hallo erstmal!
Ich bin gerade dabei ein Programm zu schreiben, dass Graphen von mathematischen Funktionen in einem Koordinatensystem anzeigt. Den größten Teil der Arbeit habe ich schon geschafft: Mein Koordinatensystem (zunächst undynamisch von -10 bis 10) wird gezeichnet und Funktionen aller Art lassen sich aufzeichnen.
Nun taucht aber bei mir im linken Bereich des Koordinatenssystem irgendein Fehler auf, aber seht euch am besten mal das Screenshot an:
www.12.gym-pbg.de/im...oordinatensystem.gif
Man sieht, dass die Linien nicht mehr nachgezogen werden. Ich hab aber keine Ahnung warum. Und das ist auch immer nur im linken Bereich, bei alle Funktionen. Habt ihr eine Ahnung woran das liegen könnte `?
Hier der Code, der die Funktion zeichnet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TForm1.DrawGraph; Var ix, iy:Real; x, x1:Real; f, f1:Real; i:Integer; ix1,iy1: Real; begin
i := 0; While (i <= 400) Do Begin x := (i - 200) / 20; f := sin(x);
x1 := (i - 201) / 20; f1 := sin(x1);
ix := (x*20) + 200; iy := PaintBox1.Height/2-Round((f*20)); ix1 := (x1*20) + 200; iy1 := PaintBox1.Height/2-Round((f1*20)); if (frac(iy) = 0) AND (frac(ix) = 0) AND (ix1>=0) then begin With PaintBox1.Canvas Do Begin MoveTo( Trunc(ix1),Trunc(iy1) ); LineTo( Trunc(ix), Trunc(iy) ); Pixels[Trunc(ix),Trunc(iy)] := clBlack; end; end; i:=i+1; End; end; |
Vielleicht noch zur Information: Die PaintBox1 hat die Maße 400*400 px und der Mittelpunkt liegt bei 200,200.
So, wenn ihr irgendwas findet, dann erklärt das bitte etwas. BIn noch ziemlicher Anfänger. Und nicht gleich rumschimpfen, das dieses Koordinatensystem noch statisch ist. Ich bin ja noch am probieren. Und besser, wenns erstmal so klappt, als gar nicht.
Danke für eure Hilfe
Mastereye
Moderiert von Tino: Img-Tag entfernt.Moderiert von Tino: Topic aus Sonstiges verschoben am Mo 08.11.2004 um 12:48
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 08.11.04 09:24
Hallo!
Vielleicht hilft dir dies ja weiter:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| unit FunctionPlotter;
interface
uses Classes, Controls, Graphics;
type TPlotEvent=function(X:Real):Real of Object;
type TFunctionPlotter=class(TComponent) private FOnPlot:TPlotEvent; public procedure PlotFunction(MinX,MaxX,MinY,MaxY:Real; Canvas:TCanvas; Width,Height:Integer); virtual; published property OnPlot:TPlotEvent read FOnPlot write FOnPlot; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Win32',[TFunctionPlotter]); end;
procedure TFunctionPlotter.PlotFunction(MinX, MaxX, MinY, MaxY: Real; Canvas:TCanvas; Width,Height:Integer); var Row,Column:Integer; var X,Y:Real; var PixelPerHeightUnit:Real; var PixelPerWidthUnit:Real; begin PixelPerHeightUnit:=Height/(MaxY-MinY); PixelPerWidthUnit:=Width/(MaxX-MinX);
Canvas.MoveTo(-2,0); for Column:=-1 to Width-1 do begin
X := MinX + Column/PixelPerWidthUnit;
Y := FOnPlot(X);
Row :=Height -Trunc(Y*PixelPerHeightUnit-MinY*PixelPerHeightUnit);
Canvas.LineTo(Column,Row); end; end;
end. |
Cu,
Udontknow
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 08.11.04 09:57
Ich glaub, der Fehler liegt in der Rechenungenauigkeit der Sinus-Funktion. Wenn ich mein ASM-Handbuch richtig im Kopf hab, können Prozessoren die trigonometrischen Funktionen nur zwischen -Pi/4<=x<=Pi/4 korrekt berechnen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 08.11.04 10:26
Oh wirklich? Dann habe ich ja da anscheinend ein Meisterwerk der Programmierung mit meinem Funktionsplotter hingelegt, der dieses ASM-Problem umgeht, wie? Bei mir klappt´s jedenfalls. 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 08.11.04 19:49
OK, ich hab's nochmal genau in meinem ASM-Handbuch nachgeschlagen und bin zu folgendem Ergebnis gekommen:
FCOS (FPU-Cosinus-Befehl) existiert seit 80387 und benötigt 123-772 Taktzyklen, wenn -Pi/4<=x<=Pi/4, ansonsten werden weitere 76-Takte für die Standardisierung benötigt. Diese Extra-Takte treffen nur auf 80387-FPUs zu.
Weiterhin gibt es aber, vor allem für wissenschaftliche Programme den Hinweis, dass Argumente für Sin\Cos x >> 360 zu vermeiden sind, da dies zu Rechenungenauigkeiten im Programm führen kann. Inwieweit der Hinweis auch noch für neuere Prozessoren gilt, kann ich leider nicht sagen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 08.11.04 21:27
Und inwieweit das überhaupt eine Rolle für die Delphi-Implementierungen dieser Funktionen spielt, ist auch nicht bekannt.  Meinst du, daß, wenn es tatsächlich daran läge, die Delphi-Hilfe dies verschweigen würde?
Cu,
Udontknow
|
|
jaevencooler
      
Beiträge: 166
Erhaltene Danke: 6
MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
|
Verfasst: Di 09.11.04 18:26
Moin, Moin,
wann und wie oft zeichnest Du das Koordinatenkreuz nach ??
Eventuel überschreibst du dabei die Werte in der Sinuskurve, passiert gerne und schnell wenn mann mit moveto ond paint arbeitet.
gruß
Michael
|
|
Mastereye 
Hält's aus hier
Beiträge: 6
D7
|
Verfasst: Di 09.11.04 20:36
Also, ich hab nicht gedacht, dass doch noch welche antworten, also sry, dass ich erst jetzt wieder antworte.
Ich hab glaub ic auch schon das Problem gefunden. Als ich das Projekt neu gespeichert habe, hat der den Graphen irgendwie komplett gezeichnet.
Also an der Sinus Funktion lag das auf keinen Fall. Ich hab nachträglich noch mal die das Koordinatensystem von der Skalierung her geändert, und genau im gleichen Bereich wurde der Graph nicht gezeichnet. Und auch bei allen andren Funktionen, die ich getestet habe, war da ein Fehler.
Nun gehts ja aber komischerweise. Trotzdem danke für eure Bemühungen.
PS: Hab mein Koordinatensystem jetzt schon dynamisch hinbekommen.
Mastereye
|
|
|