![]() |
Bug in PaintBox
Hey!
Und zwar habe ich folgendes Problem: In meiner Paintbox (601*593) habe ich wie folgt eine x- und eine y-Koordinate gezeichnet
Delphi-Quellcode:
Außerdem gibt ein Timer diese umgekehrte Parabel aus:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin Paintbox1.Canvas.MoveTo(0,0); Paintbox1.Canvas.LineTo(0,593); Paintbox1.Canvas.MoveTo(0,592); Paintbox1.Canvas.LineTo(601,592); // Zeichnen der x- und y-Achse end;
Delphi-Quellcode:
Nun passiert es allerdings (nur beim 1. Kompilieren nach speichern), dass, während die Parabel zur Hälfte gezeichnet ist, eine Diagonale von (0,0) auf den Scheitelpunkt der Parabel gezeichnet wird und die Parabel dann aber ungerührt fortfährt...
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
Woher kann das kommen? |
Re: Bug in PaintBox
kannst du mal ein Bild zeigen, von deinem Problem?
Was ich nicht ganz verstehe ist deine Zeichenfunktion:
Delphi-Quellcode:
Nach meinen Kenntnissen hat eine Parabel folgende Form: y = ax^2 + bx + c
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
und eine umgekehrte Parabel die Form y = -abs(ax^2 + bx + c) // grob gesehen, gemeint ist, die Funktionswerte sind negativ. Deswegen sollte bei deiner x-Koordinate nur x stehen nicht xx und bei deiner y-Koordinate steht ax^2 + bx + 593. Vieleicht ist der Befehl Lineto hier weniger gut geeignet, als vieleicht die Pixel. Sprich:
Delphi-Quellcode:
dann sollte der Fehler mit der überflüssigen Linie (egal, wo die herkommt) eigentlich umgangen sein. Die Funktion könntest auch gut in eine einfache For-Schleife stecken, ala:
PaintBox1.Canvas.Pixels[x,ax^2 + bx + c] := clred; // Farbe der Linie hier angeben
Delphi-Quellcode:
du solltest natürlich darauf achten, dass du nur ganze Zahlen als Argument für die Koordinaten des Pixels übergeben solltest. Du musst also die y-Koordinate am besten mit round- oder trunc-Funktion absichern, wenn du dir nicht sicher bist, ob dies gewährleistet ist.
for i := 0 to 601 do PaintBox1.Canvas.Pixels[x,ax^2 + bx + c] := clred;
|
Re: Bug in PaintBox
im Timer gibt es nur dieses?
Delphi-Quellcode:
na kein Wunder ... zwischen den Timeraufrufen könnte der Zeiger verändert werden
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
und ohne MoveTo vorher, ist der Startpunkt also praktisch gesehn undefiniert und kann sonstwo liegen (auch auf Punkt 0:0) :!: |
Re: Bug in PaintBox
Zitat:
ich habe jetzt unter
Delphi-Quellcode:
das letzte lineto noch ein
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin Paintbox1.Canvas.MoveTo(0,0); Paintbox1.Canvas.LineTo(0,593); Paintbox1.Canvas.MoveTo(0,592); Paintbox1.Canvas.LineTo(601,592); // Zeichnen der x- und y-Achse end;
Delphi-Quellcode:
gesetzt.
lineto(0,593)
|
Re: Bug in PaintBox
da dürfte kein Problem geben, da LineTo selber die Cursorposition auf den Entpunkt setzt.
und demnach ist beim letzen LineTo der (End)Punkt des vorherrigen LineTo's gültig. wie sieht es denn nun im Timer aus? ist vor dem LineTo dort ein MoveTo? |
Re: Bug in PaintBox
nein. weil der sonst mit jedem timer durchgang den cursor dahin setzt und von dort aus dann zur gewünschten koordinate zeichnet...dann kommen aus einem punkt ganz viele geraden zu den verschiedenen koordinaten, aber nicht eine parabel!
|
Re: Bug in PaintBox
Dann wirst du dir wohl oder übel die letzte Position irgendwo speichern und dann im Timer für MoveTo verwenden müssen. (also überall da, wo der curser vorher mal gesetzt worden sein kann.)
|
Re: Bug in PaintBox
Ich würde das ganze etwas umstellen und generell nur im Paint-Event der Paintbox zeichnen. Denn so wie es jetzt ist kann es sein das dein gezeichnetes aus dem Timerereignis fix mal weg ist wenn die Paintbox sich neu zeichnen muss.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz