Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kugel/Kreis prallt von Eck/Kante ab (https://www.delphipraxis.net/78824-kugel-kreis-prallt-von-eck-kante-ab.html)

dino 12. Okt 2006 06:44

Re: Kugel/Kreis prallt von Eck/Kante ab
 
nein ich möchte aber auch draufrumkritzeln dürfen, dass mein kreis sogar an ner Kurve abtitscht

dafür müsste er nur immer ne Pixelabfrage machen, ob er nen Punkte berührt, nur wie geht das?

xZise 12. Okt 2006 07:16

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Zitat:

Zitat von Florian H

eine Frage: Wie kommt die Kollision 1 zu stande, wenn es doch an sich das gleiche wie 3 ist?

Corpsman 12. Okt 2006 07:25

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Hi,

Dein Problem sieht ganz nach meinem Pinpong Sample aus das ich die Letzten Tage mal zusammengestellt habe.


DL Link ( inclusive Source )

Gruß Corpsman

dino 12. Okt 2006 11:55

Re: Kugel/Kreis prallt von Eck/Kante ab
 
3 trifft mit einer anderen höhe auf das Rechteck
(1 müsste hierfür etwas weiter links und demnach auch etwas weiter runter gezeichnet sein)
sieht man zwar nicht, ist aber so

wie kann man denn nun diese PxelanPixel?-frage lösen?

Sidorion 12. Okt 2006 12:02

Re: Kugel/Kreis prallt von Eck/Kante ab
 
genau so, wie mehrfach beschrieben.
Vektor Pixel-Kugelmitte=>Normale.
Winkel Einfall-Normale = Winkel Ausfall-Normale.
=> Ausfall = Einfall+2*(Winkel Einfall-Normale)
//Edit: Der Abprall an Linien geht übrigens genauso mit einer Ausnahme: Du berechnest vorher den Pixel der Line, den die Kugel berührt.

dino 12. Okt 2006 12:10

Re: Kugel/Kreis prallt von Eck/Kante ab
 
auf welche frage war das die antwort???

Sidorion 12. Okt 2006 12:57

Re: Kugel/Kreis prallt von Eck/Kante ab
 
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.

dino 12. Okt 2006 13:02

Re: Kugel/Kreis prallt von Eck/Kante ab
 
ich hab an eine Stelle geschrieben, dass ich auch auf die canvas der Form zeichnen will(per maus) und der Ball soll dann auch daran abtitschen

hier jeden Punkt zu speichern und immer wieder zu testen ist mir ein bisschen viel

der soll nur um sich gucken, ob da Pixel sind

also nur in die bewegungsrichtung zugewandte kreishälfte

Sidorion 12. Okt 2006 13:40

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Das ist doch das selbe...Der Canvas ist doch ein 2dim array wo die farbe gespeichert ist. 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.
mit dem um sich gucken ginge auch, aber dann must Du gewährleisten, dass sich der Kreis je Schritt nur um einen Pixel bewegt.

Cöster 12. Okt 2006 15:32

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Zitat:

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:

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:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.
Seite 3 von 6     123 45     Letzte »    

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