Delphi-PRAXiS
Seite 2 von 6     12 34     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 11. Okt 2006 18:57

Re: Kugel/Kreis prallt von Eck/Kante ab
 
und wie findet man am besten herraus, ob man kolidiert?

3_of_8 11. Okt 2006 19:00

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Einfach mithilfe von Sinus/Cosinus und Radius ausrechnen.

dino 11. Okt 2006 19:03

Re: Kugel/Kreis prallt von Eck/Kante ab
 
abstand von was zu was???

wenn ich wüsste welche Punkte ich mir angucken müsste wäre ich schon fertig

3_of_8 11. Okt 2006 19:08

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Also: Du hast eine Menge von Punkten P, bei denen du auf Kollision überprüfen willst.

Jetzt berechnest du für jeden Punkt Q aus P mithilfe des Hypotenusensatzes den Abstand PM wobei dein Kreis k(M;r) ist. Wenn PM<=r, dann war das eine Kollision.

dino 11. Okt 2006 19:12

Re: Kugel/Kreis prallt von Eck/Kante ab
 
nun das sind aber sehr sehr viele Punkte...

dino 11. Okt 2006 19:13

Re: Kugel/Kreis prallt von Eck/Kante ab
 
geht das auch anders?

Sidorion 11. Okt 2006 19:35

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Eine Kugel prallt NIE auf zwei Ecken gleichzeitig. Und wenn Doch, dann prallt sie halt auf eine zuerst. Sprich Du berechnest den Abprall von der einen Ecke und mit dem neuen Richtungsvektor dann den Abprall an der andern. Das ist dann genausogut, als wäre sie gleichzeitig an beiden abgeprallt, was sie ja eh NIE tut.

dino 11. Okt 2006 19:36

Re: Kugel/Kreis prallt von Eck/Kante ab
 
und welche zuerst macht keinen unterschied?

Edit: mit der gerade fand ich schon gut, aber kann man die kollision nicht auch anhand anderer methoden testen?

Nikolas 11. Okt 2006 22:18

Re: Kugel/Kreis prallt von Eck/Kante ab
 
Die Frage ist eben, ob du für den Kreis eine Bewegungsgleichung aufstellst und die dann mit den Punkten schneidest, oder ob du den Kreis immer ein kleines Stückchen verschiebst und dann auf Kollision testest.
Erste Methode ist dann sinnvoll, wenn du nur einen Kreis hast oder, wenn die Orte aller abprallrelevanter Punkte von Beginn der Simulation feststehen. Dann kannst du mit einer recht einfachen Rechung überprüfen, an welchen Punkt der Kreis als erstes kommt und auch, ob mehrere Punkte gleichzeitig getroffen werden.
Bei der zweiten Methode musst du nach jedem Umsetzen den Pythagoras benutzen (@Borg: wo hast du hier einen Hypothenusensatz?), bei dem du auch überprüfen kannst, welcher Punkt als erster getroffen wurde.

Cöster 11. Okt 2006 22:58

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

Zitat von dino
und welche zuerst macht keinen unterschied?

Nö, wieso sollte es?

Zitat:

Zitat von dino
Edit: mit der gerade fand ich schon gut, aber kann man die kollision nicht auch anhand anderer methoden testen?

Wieso, die Gerade ist doch das Einfachste. Die andere Methode ist eben, sie nacheinander abprallen zu lassen.

Zitat:

Zitat von dino
und wie findet man am besten herraus, ob man kolidiert?

Wenn es sich bei den Körpern wie im Beispiel ganz oben um einfache Quadrate handelt, muss man sich NICHT etliche Punkte raussuchen und gucken, ob sie geschnitten werden:

Erstmal prüfen, ob eine der Kanten berührt wird. Das ist denke ich relativ einfach:

Delphi-Quellcode:
function CollidesWithEdge(const Circle: TCircle; Rect: TRect): Boolean;
begin
  result :=
    { vertikale Kanten }
    ((Circle.Center.X + Circle.Radius > Rect.Left) and
    (Circle.Center.X - Circle.Radius < Rect.Right) and
    (Circle.Center.Y > Rect.Top) and
    (Circle.Center.Y < Rect.Bottom)) or
    { horizontale Kanten }
    ((Circle.Center.Y + Circle.Radius > Rect.Top) and
    (Circle.Center.Y - Circle.Radius < Rect.Bottom) and
    (Circle.Center.X > Rect.Left) and
    (Circle.Center.X < Rect.Right));
end;
Dann die Kollisionsabfrage für jede der Ecken:

Delphi-Quellcode:
function CollidesWithVertex(const Circle: TCircle; Rect: TRect): Boolean;
begin
  result :=
    { obere linke Ecke }
    (Circle.Radius > Hypot(Circle.Center.X - Rect.Left, Circle.Center.Y - Rect.Top)) or
    { obere rechte Ecke }
    (Circle.Radius > Hypot(Circle.Center.X - Rect.Right, Circle.Center.Y - Rect.Top)) or
    { untere linke Ecke }
    (Circle.Radius > Hypot(Circle.Center.X - Rect.Left, Circle.Center.Y - Rect.Bottom)) or
    { untere rechte Ecke }
    (Circle.Radius > Hypot(Circle.Center.X - Rect.Right, Circle.Center.Y - Rect.Bottom));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 Uhr.
Seite 2 von 6     12 34     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