Einzelnen Beitrag anzeigen

Cöster

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

Re: Kugel/Kreis prallt von Eck/Kante ab

  Alt 11. Okt 2006, 22:58
Zitat von dino:
und welche zuerst macht keinen unterschied?
Nö, wieso sollte es?

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 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;
  Mit Zitat antworten Zitat