Wie Sie wissen, wenn Sie eine Linie schneidet ein Rechteck
Habe ich ausgecheckt, diese Frage, aber die Antwort ist sehr groß für mich:
Wie Sie wissen, wenn Sie eine Linie schneidet eine Ebene in C#? - Einfache 2D-geometrie
Ist es .NETTO-Methode wissen, ob eine Linie durch zwei Punkte definiert schneidet ein Rechteck?
public bool Intersects(Point a, Point b, Rectangle r)
{
//return true if the line intersects the rectangle
//false otherwise
}
Vielen Dank im Voraus.
InformationsquelleAutor der Frage Daniel Peñalba | 2011-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort HABJAN
Leider die falsche Antwort gewählt wurde. Es ist viel zu teuer zum berechnen der tatsächlichen Schnittpunkte, brauchen Sie nur Vergleiche. Das Schlüsselwort zu suchen ist "Line-Clipping" (http://en.wikipedia.org/wiki/Line_clipping). Wikipedia empfiehlt der Cohen-Sutherland-Algorithmus ( http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland ), wenn Sie wollen schnell ablehnt, das ist wahrscheinlich das häufigste Szenario. Es ist eine C++-Implementierung auf der wikipedia-Seite. Wenn Sie nicht daran interessiert sind, tatsächlich clipping der Linie, können Sie überspringen die meisten.
Die Antwort von @Johann sehr ähnlich sieht, Algorithmus, aber ich habe das nicht im detail angeschaut.
InformationsquelleAutor der Antwort JPE
Brute-force-Algorithmus...
Prüfen Sie zunächst, ob das rect, ist das Links oder rechts von der Linie Endpunkte:
Dann, wenn die oben war nicht genug, um auszuschließen, Kreuzung, prüfen Sie, ob das Rechteck oberhalb oder unterhalb der Linie Endpunkte:
Dann, wenn die oben war nicht genug, um auszuschließen, Kreuzung, müssen Sie die Gleichung der Linie, die
y = m * x + b
um zu sehen, ob das Rechteck wird über der Zeile:Dann, wenn die oben war nicht genug, um auszuschließen, Kreuzung, die Sie brauchen, um zu überprüfen, ob die rect-unter der Zeile:
Dann, wenn Sie hier erhalten:
N. B. ich bin sicher, es gibt eine elegantere algebraische Lösung, aber die Ausführung dieser Schritte geometrisch mit Stift und Papier wird leicht zu Folgen.
Einige ungetestete und nicht kompilierter code zu gehen:
InformationsquelleAutor der Antwort Johann Gerell
Nahm ich HABJAN-Lösung, die gut funktioniert, und baute es zu Objective-C. Der Objective-C-code ist wie folgt:
Vielen Dank HABJAN. Ich werde beachten Sie, dass auf den ersten schrieb ich meine eigene routine, die überprüft, jeder Punkt entlang des Verlaufs, und ich Tat alles, was ich tun könnte, um die Leistung zu maximieren, aber dies wurde sofort viel schneller.
InformationsquelleAutor der Antwort John Bushnell
Dieser code hat eine bessere Leistung:
Können Sie auch überprüfen, wie es funktioniert in JS demo: http://jsfiddle.net/77eej/2/
Wenn Sie zwei Punkte haben und Rect-Sie können diese Funktion aufrufen, so:
InformationsquelleAutor der Antwort Wojtpl2
Ist es nicht einfach vorgegeben .NETTO-Methode, die Sie aufrufen können, um zu erreichen, dass. Jedoch, die Verwendung der Win32-API gibt es eine ziemlich einfache Möglichkeit, dies zu tun (einfach im Sinne der Umsetzung, die Leistung ist nicht der starke Punkt): LineDDA
Diese Funktion ruft die callback-Funktion für jedes pixel der Linie gezeichnet werden. In dieser Funktion können Sie überprüfen, ob der pixel in Rechteck -, wenn Sie eine finden, dann schneidet.
Als ich sais, dies ist nicht die Schnellste Lösung, aber Recht einfach zu implementieren. Um es zu benutzen in C#, Sie müssen aber natürlich ddlimport es aus gdi32.dll.
InformationsquelleAutor der Antwort Thalur
Einfachsten computational geometry Technik ist nur zu Fuß durch die Segmente des Polygons und sehen, ob es schneidet mit einem von Ihnen, als er muss dann auch die Schnittmenge des Polygons.
Der einzige Nachteil dieser Methode (und auch die meisten CG) ist, dass wir müssen vorsichtig sein, über Grenzfälle. Was, wenn die Linie überquert das Rechteck auf einen Punkt - wir zählen, wie Kreuzung oder nicht? Achten Sie darauf, in Ihrer Umsetzung.
Bearbeiten: Das typische Werkzeug für die Linie-schneidet-segment-Berechnung ist ein
LeftOf(Ray, Point)
- test, der gibt zurück, ob der Punkt ist auf der linken Seite des Strahls. Gegeben eine Liniel
(die wir verwenden, als ray) und ein segment mit Punktea
undb
die Linie schneidet das segment, wenn ein Punkt Links und einem Punkt nicht:Wieder, Sie müssen aufpassen, für Rand-Fällen, wenn der Punkt auf der Linie, sondern hängt davon ab, wie Sie wollen, um tatsächlich zu definieren Kreuzung.
InformationsquelleAutor der Antwort ceyko
Einheit (invertiert y!). Dieser kümmert sich um die division durch null problem, die andere Ansätze haben hier:
InformationsquelleAutor der Antwort vincent