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;