Line Kreuzung mit der AABB Rechteck?
Vorzugsweise ohne Einsatz jeglicher Art von Schleife, wie diese verwendet werden können in einem Spiel.
Möchte ich schneiden Sie eine Linie mit einem Rechteck von beliebiger Größe.
Aber ich möchte auch für den Schnittpunkt mit[s] zurückgegeben werden.
Es ist möglich, ich habe mich ein wenig googeln, aber noch nicht gearbeitet haben es aus.
Die Linie ist definiert mit (x1,y1,x2,y2).
Das Rechteck hat diese zwei Punkte zu.
InformationsquelleAutor der Frage Steffan Donal | 2010-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen, einfach tun, eine Linie-segment-line-segment-intersection check auf jeden Linienabschnitt (edge) das macht das Rechteck. Hier ist ein line-segment-intersection detection Algorithmus, den ich vor Ewigkeiten geschrieben hatte, Baggergut aus einem meiner alten XNA-Projekte:
Verlasse ich die Eingabe jeder Kante in der oben beschriebenen Methode und Zusammenstellung der Ergebnisse als übung für den Leser 🙂
Bearbeiten 1 Jahr später nun habe ich die Universität besucht und gemacht eine Grafik-Kurs:
Werfen Sie einen Blick auf die Cohen–Sutherland-Algorithmus dies zu tun, effizient, wenn Sie eine große Menge von Linien, wo die meisten nicht das Rechteck schneidet. Es verwendet eine 9-segment-raster und legen Sie jeden Endpunkt der Linie in einer region, sagte raster:
Mithilfe dieser, können wir sagen, wenn es keine line-Kreuzungen:
Zum Beispiel hier
CD
wird nicht schneiden Sie das Rechteck (rot dargestellt im ersten Bild), da beideC
undD
sind in der oberen Reihe, und weder wirdAB
. Für diejenigen, wo die Zeile schneiden Sie die Rechteck müssen wir versuchen, das line-line-Kreuzungen.Diese Weise werden die Abschnitte nummeriert/beschriftet ermöglicht es uns, einfach das zu tun
x AND y != 0
(wox
undy
sind die Beschriftungen der Abschnitte für jedes der Linie Endpunkte), um zu bestimmen, wenn es nicht zu einer Kreuzung.Mithilfe dieser Methode haben wir viele, viele weniger line-line-Kreuzungen, das beschleunigt die ganze Sache Massiv.
InformationsquelleAutor der Antwort Callum Rogers