Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bug in PaintBox (https://www.delphipraxis.net/130449-bug-paintbox.html)

rajuneon 8. Mär 2009 21:05


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:
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;
Außerdem gibt ein Timer diese umgekehrte Parabel aus:
Delphi-Quellcode:
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
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...
Woher kann das kommen?

BAMatze 8. Mär 2009 21:30

Re: Bug in PaintBox
 
kannst du mal ein Bild zeigen, von deinem Problem?

Was ich nicht ganz verstehe ist deine Zeichenfunktion:
Delphi-Quellcode:
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
Nach meinen Kenntnissen hat eine Parabel folgende Form: y = ax^2 + bx + c

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:
PaintBox1.Canvas.Pixels[x,ax^2 + bx + c] := clred; // Farbe der Linie hier angeben
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:

Delphi-Quellcode:
for i := 0 to 601 do PaintBox1.Canvas.Pixels[x,ax^2 + bx + c] := clred;
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.

himitsu 8. Mär 2009 21:42

Re: Bug in PaintBox
 
im Timer gibt es nur dieses?
Delphi-Quellcode:
PaintBox1.Canvas.LineTo(xx,yy*(-1)+593);
na kein Wunder ... zwischen den Timeraufrufen könnte der Zeiger verändert werden
und ohne MoveTo vorher, ist der Startpunkt also praktisch gesehn undefiniert und kann sonstwo liegen (auch auf Punkt 0:0) :!:

rajuneon 8. Mär 2009 21:54

Re: Bug in PaintBox
 
Zitat:

Zitat von himitsu
na kein Wunder ... zwischen den Timeraufrufen könnte der Zeiger verändert werden
und ohne MoveTo vorher, ist der Startpunkt also praktisch gesehn undefiniert und kann sonstwo liegen (auch auf Punkt 0:0) :!:

Ich glaub, da lag der Fehler...
ich habe jetzt unter
Delphi-Quellcode:
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;
das letzte lineto noch ein
Delphi-Quellcode:
lineto(0,593)
gesetzt.

himitsu 8. Mär 2009 22:01

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?

rajuneon 8. Mär 2009 23:09

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!

himitsu 9. Mär 2009 05:29

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.)

SirThornberry 9. Mär 2009 08:09

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 09:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz