AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bug in PaintBox

Ein Thema von rajuneon · begonnen am 8. Mär 2009 · letzter Beitrag vom 9. Mär 2009
Antwort Antwort
rajuneon
(Gast)

n/a Beiträge
 
#1

Bug in PaintBox

  Alt 8. Mär 2009, 22:05
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:
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?
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Bug in PaintBox

  Alt 8. Mär 2009, 22:30
kannst du mal ein Bild zeigen, von deinem Problem?

Was ich nicht ganz verstehe ist deine Zeichenfunktion:
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:
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:

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

Re: Bug in PaintBox

  Alt 8. Mär 2009, 22:42
im Timer gibt es nur dieses?
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rajuneon
(Gast)

n/a Beiträge
 
#4

Re: Bug in PaintBox

  Alt 8. Mär 2009, 22:54
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 lineto(0,593) gesetzt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: Bug in PaintBox

  Alt 8. Mär 2009, 23:01
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rajuneon
(Gast)

n/a Beiträge
 
#6

Re: Bug in PaintBox

  Alt 9. Mär 2009, 00:09
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: Bug in PaintBox

  Alt 9. Mär 2009, 06:29
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.)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Bug in PaintBox

  Alt 9. Mär 2009, 09:09
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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