Ich denke, Ihre Zeichnung ist etwas irreführend, weil Sie Striche vom Punkt auf dem Kreis zeichnen, der Ihre Bewegungsrichtung tangiert. Ich kann sehen, dass die Kollisionen mit Ihren Gitterkanten auftreten, wenn die oberen und linken Punkte Ihres Kreises eine Kante berühren.
Sei C dein Zentrum und r der Radius, also P ' = C + ( r , 0) und P " = C + (0, r).
Wenn D Ihr Richtungsvektor (der Versor) ist, haben Sie zwei Linien:
R '= D · t + P' ,
R = D · t + P
Sie müssen einfach den Schnittpunkt dieser Linien mit den Gleichungslinien finden:
y = i und y = i , das sind die Kanten Ihres Gitters!
Die Lösung ist einfach, da Sie einfach die x- oder y-Komponente von R 'und R "berücksichtigen müssen. Sie finden den t s -Wert für jeden Einschnitt und die Punkte für diese t s. Sortieren Sie diese Punkte einfach nach t und Ihnen sind fertig.
Ich glaube, Sie können leicht sagen, welche Zelle getroffen wird, wenn Sie den Schnittpunkt kennen.
Dies funktioniert, wenn r <1 (die Zellenbreite und -höhe) ist.
Es funktioniert auch für die anderen Fälle, in denen einfach P ' und P " berücksichtigt werden . Wir wählen TOP und LEFT aufgrund der Richtung. BOTTOM und RIGHT sollten für die entgegengesetzte Richtung berücksichtigt werden. Sie verstehen, warum.
Schauen Sie sich nun dieses Bild an:
Der Kreis ist größer als eine einzelne Zelle und wir nehmen an, dass er in die gleiche Richtung wie Ihre Zeichnung verläuft. P1 ist der erste Punkt, der sich berührt, P2 ist der zweite, P3 ist nutzlos, weil er sich in der unteren Hälfte befindet. Was Sie tun müssen, ist, Strahlen von P1 und P2 wie zuvor gesehen zu werfen und dasselbe für die vertikalen Linien zu tun.
Im Allgemeinen haben Sie neben den oberen und linken Punkten andere Ausgangspunkte, von denen aus Sie Ihre Strahlen abschießen. Je größer Ihr Kreis ist, desto mehr Strahlen müssen geworfen werden.
Um ehrlich zu sein, können Sie es vermeiden, all diese Strahlen unter geometrischen Gesichtspunkten abzuschießen, aber das kann das Verständnis der Dinge erschweren.