Einzelnen Beitrag anzeigen

Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#30

Re: Kugel/Kreis prallt von Eck/Kante ab

  Alt 12. Okt 2006, 15:32
Zitat von Sidorion:
Sorry..du wolltest woht wissen, ob und welchen Pixel die Kugel während ihrer Bewegung berührt...
Ob ist relativ einfach: alle, deren Abstand zur Strecke Iststandort-Sollstandort kleiner Radius der Kugel (wobei hier zu beachten ist, dass falls der kürzeste Abstand ausserhalb der Strecke (also hinter dem Zielpunkt) liegt, (Abstand Pixel-gerade)^2 + (Abstand Lotfußpunkt-Zielpunkt)^2 <=Radius^2 sein muss).
für alle diese Pukte berechnest Du nun den Abstand zum Startpunkt wie Folgt:
1. Berechnung Abstand LotFuß zum Startpunkt
2. hiervon ziehst Du ab: wurzel(Radius^2-(Abstand Punkt-gerade)^2).
Der kleinste Wert ist dann der Pixel, der zerst berührt.

Wenn Dir das zu kompliziert war, sag bescheid, dann zieh ich mir heute abend mal ne Zeichnung aus den Fingern.
Wenn du dich etwas genauer ausgedrückt hättest, könnte man es auch verstehen. Was meinst du mit Ist- und Sollstandort? der Mittelpunkt der Kugel vor und nach Bewegung? Wie errechnest du denn einen Abstand zwischen einem Punkt und einer Strecke? Was meinst du mit Zielpunkt und Startpunkt? Das gleiche wie der Sollstandort und Iststandort? Welche Gerade meinst du mit Gerade? Und außerdem kann man zu einer Gerade keinen Abstand messen. Was heißt Lotfußpunkt?

Prüfst du immer, ob sich der Ball dahin bewegen kann, wohin er sich bewegen will und bewegst ihn erst dann?


Zitat von Sidorion:
Du liest einfach per readline die bitmap des canvas aus und da kannst du dann gucken, ob pixel gesetzt ist oder nicht. ReadPixel ginge auch, ist aber langsamer.
Du meinst wohl TBitmap.ScanLine und TCanvas.Pixels, oder?

Zitat von dino:
der soll nur um sich gucken, ob da Pixel sind
Ja, das wär vielleicht gar nicht mal so schlecht. Dann bewegst du die Kugel aber nicht sofort um so viele Pixel, wie sie sich bewegen soll, sondern immer nur um einen. Kann man mit ner for-Schleife machen, wenn die Kugel eine Geschwindigkeit von 5 Pxs/Timeraufruf hat: for i := 1 to 5. In jedem Schleifendurchlauf prüfst du dann, ob sich auf den Pixels auf denen die Kugel jetzt ist und vorher nicht war, nicht zu überschreitende Pixels befinden. Wenn ja, berechnest du mit jedem dieser nicht zu überschreitenden Pixels nacheinander die neue Richtung. In diese bewegt sich die Kugel dann beim nächsten Schleifenaufruf um einen Pixel.
  Mit Zitat antworten Zitat