So finden Sie den Schnittpunkt zwischen einer Linie und einem Rechteck?
Ich habe eine Linie, die geht vom Punkte A bis B; I (x,y) der beiden Punkte. Ich habe auch ein Rechteck, das zentriert auf B und die Breite und Höhe des Rechtecks.
Ich brauche, um den Punkt zu finden in der Zeile, schneidet das Rechteck aus. Gibt es eine Formel, die mir die (x,y), Punkt?
InformationsquelleAutor der Frage John Petterson | 2009-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht zu prüfen, aus Graphics Gems - dies ist eine klassische Reihe von Routinen für die Grafik, und enthält viele der algorithmen erforderlich. Obwohl es in C und etwas altmodisch die algorithmen noch funkeln und es sollte trivial sein, um eine übertragung auf andere Sprachen.
Für Ihr Aktuelles problem, die erstellen Sie einfach die vier Zeilen für das Rechteck und sehen, welche Schnittmenge die angegebene Zeile.
InformationsquelleAutor der Antwort peter.murray.rust
Vorausgesetzt, das Rechteck ist Achsen ausgerichtet, das macht die Sache ziemlich einfach:
Die Steigung der geraden ist s = (Ay - By)/(Ax - Bx).
Sobald Sie wissen, die Kante schneidet Sie wissen, Koordinate: x = Bx ± w/2 oder y = ± h/2, je nachdem auf welche Flanke du schlagen. Die andere Koordinate ist gegeben durch y = + s * w/2 oder x = Bx + (h/2)/s.
InformationsquelleAutor der Antwort Joren
Hier ist eine Lösung in Java, die true zurückgibt, wenn ein Liniensegment (die ersten 4 Parameter) schneidet eine Achse ausgerichtet Rechteck (die letzten 4 Parameter). Es wäre trivial, um die Rückkehr der Schnittpunkt statt einem boolean. Es funktioniert, indem Sie zuerst überprüfen, ob völlig außerhalb, ansonsten über den line-Gleichung
y=m*x+b
. Wir wissen, die Linien, aus denen das Rechteck-Achse ausgerichtet, so dass die Kontrollen sind einfach.Ist es möglich, Verknüpfung, wenn der start oder das Ende des Segments innerhalb des Rechtecks, aber wahrscheinlich ist es besser, nur die Mathematik zu tun, die immer wieder wahr, wenn entweder oder beide segment endet im inneren. Möchten Sie die Verknüpfung sowieso, fügen Sie folgenden code nach der "vollständig außerhalb" zu überprüfen.
InformationsquelleAutor der Antwort NateS
Werde ich nicht geben Ihnen ein Programm, das zu tun, aber hier ist, wie Sie es tun können:
InformationsquelleAutor der Antwort Lukáš Lalinský
Ich bin kein Mathe-fan noch habe ich besonders gerne, übersetzen, Sachen von anderen Sprachen, wenn andere dies bereits getan haben, so dass, wenn ich eine langweilige übersetzung, füge ich es zu dem Artikel führte mich zu dem code. Um zu verhindern, dass jemand doppelte Arbeit.
Also, wenn Sie wollen, um diese Kreuzung von code in C#, haben einen Blick hier http://dotnetbyexample.blogspot.nl/2013/09/utility-classes-to-check-if-lines-andor.html
InformationsquelleAutor der Antwort LocalJoost
Eine weitere option, die Sie betrachten können, vor allem, wenn Sie planen, testen viele Zeilen mit dem gleichen Rechteck ist für die Transformation von Koordinatensystem die Achsen ausrichten mit der diagonalen des Rechtecks. Dann seit Ihr line oder ray beginnt in der Mitte des Rechtecks bestimmen Sie den Winkel, dann können Sie sagen, welches segment es schneidet durch den Winkel (D. H. <90deg seg 1, 90deg< <180GRAD seg 2, etc...). Dann muss man natürlich zurück verwandelt, um die ursprünglichen Koordinatensystem
Obwohl dies scheint, wie mehr Arbeit die Transformationsmatrix und Ihre inverse werden einmal berechnet und dann wiederverwendet. Dies erstreckt sich auch auf höher-dimensionale Rechtecke mehr leicht, wo würden Sie haben zu prüfen, Quadranten und Kreuzungen mit Gesichtern in 3D-und so weiter.
InformationsquelleAutor der Antwort Ivajlo Donev
Ich weiß nicht, ob dies der beste Weg ist, aber was Sie tun könnten, ist, um herauszufinden, die Teil der Linie innerhalb des Rechtecks. Sie bekommen können, dass die von der Breite der Rechteck-und der Unterschied zwischen den x-Koordinaten von A und B (oder-Höhe und y-Koordinaten, basierend auf der Breite und Höhe können Sie prüfen, welcher Fall gilt, und dem anderen Fall wird auf die Erweiterung einer Seite des Rechtecks). Wenn Sie dieses haben, nehmen Sie einfach, dass der Anteil der Vektor von B nach A, und Sie haben Ihren Schnittpunkt s mit den Koordinaten.
InformationsquelleAutor der Antwort JaakkoK
Hier ist eine etwas ausführlichere Methode liefert den Schnittpunkt Abständen zwischen einer (unendlichen) Linie und ein Rechteck mit nur einfache Mathematik:
Dieser Ansatz bietet eine hohe numerische Stabilität (die Intervalle sind, in allen Fällen, das Ergebnis einer einzigen Subtraktion und division), aber auch einige Verzweigungen.
Für eine Strecke (mit start-und end-Punkte), würden Sie brauchen, um dem segment der start-Punkt als Ursprung und die Richtung, die
end - start
. Die Berechnung der Koordinaten der beiden Schnittpunkte ist so einfach wieentryPoint = origin + direction * contacts.Entry
undexitPoint = origin + direction * contacts.Exit
.InformationsquelleAutor der Antwort Cygon
Hier ist eine Lösung, die funktioniert für mich. Ich gehe davon aus, dass die rect-ist ausgerichtet auf die Achsen.
Daten:
Nun übersetzen Sie Punkt A durch den Mittelpunkt des Rechtecks, so dass die rect-zentriert ist, in O(0,0) und betrachten das problem im ersten Quartal (D. H. x > 0 und y > 0).
InformationsquelleAutor der Antwort ivanross