Ich brauche eine Funktion, um den kürzesten Abstand zwischen zwei Liniensegmenten zu finden. Ein Liniensegment wird durch zwei Endpunkte definiert. So wäre zum Beispiel eines meiner Liniensegmente (AB) durch die zwei Punkte A (x1, y1) und B (x2, y2) definiert und das andere (CD) wäre durch die zwei Punkte C (x1, y1) definiert. und D (x2, y2).
Fühlen Sie sich frei, die Lösung in jeder Sprache zu schreiben, die Sie wollen, und ich kann es in Javascript übersetzen. Bitte beachte, dass meine Geometriefähigkeiten ziemlich rostig sind. Ich habe hier bereits gesehen und bin mir nicht sicher wie man das in eine Funktion übersetzt. Vielen Dank für Ihre Hilfe.
Ist das in 2 Dimensionen? Wenn dies der Fall ist, ist die Antwort einfach der kürzeste Abstand zwischen dem Punkt A und dem Liniensegment CD, B und CD, C und AB oder D und AB. Es ist also eine ziemlich einfache "Entfernung zwischen Punkt und Linie" Berechnung (wenn die Abstände alle gleich sind, dann sind die Linien parallel).
In den 3 Dimensionen ist es ein wenig komplizierter, weil die Linien nicht unbedingt in derselben Ebene liegen, aber das scheint hier nicht der Fall zu sein?
Das ist meine Lösung in Python. Arbeitet mit 3d Punkten und Sie können für 2d vereinfachen.
[EDIT 1] Ich habe eine Klammeroption hinzugefügt, wenn Sie die Ergebnisse auf die Liniensegmente beschränken möchten
[EDIT 2] als D.A. darauf hingewiesen, weil zwei Linien parallel sind, bedeutet nicht, dass sie keinen Abstand zwischen ihnen haben können. Also habe ich den Code bearbeitet, um mit dieser Situation umzugehen. Ich habe auch die Klammerbedingungen allgemeiner gemacht, so dass jedes Segment auf jeder Seite geklemmt werden kann.
[EDIT 3] Es wurde ein Bug angesprochen, den jhutar darauf hingewiesen hat, dass er auftreten kann, wenn beide Linien Bedingungen geklemmt haben und die projizierten Ergebnisse über die Liniensegmente hinausgehen.
%Vor%Testbeispiel mit Bildern zur Visualisierung:)
%Vor%
Entnommen aus diesem Beispiel , das auch eine einfache Erklärung liefert, warum es genauso funktioniert wie VB-Code (Das tut mehr als Sie brauchen, also habe ich vereinfacht, als ich in Python übersetzte - Hinweis: Ich habe übersetzt, aber nicht getestet, also ein Tippfehler könnte vorbeigerutscht sein ...):
%Vor%Meine Lösung ist eine Übersetzung der Fnord-Lösung. Ich mache Javascript und C.
In Javascript. Sie müssen mathjs einbeziehen.
%Vor%In reinem C
%Vor%Bei der Berechnung des Mindestabstandes zwischen 2 2D-Liniensegmenten müssen Sie 4 rechtwinklig vom Endpunkt zu anderen Linienüberprüfungen nacheinander mit jedem der 4 Endpunkte messen. Wenn Sie jedoch feststellen, dass die senkrechte Linie das Liniensegment in keinem der 4 Fälle schneidet, müssen Sie 4 zusätzliche Endpunkt-zu-Endpunkt-Abstandsprüfungen durchführen, um die kürzeste Entfernung zu finden.
Ob es eine elegantere Lösung dafür gibt, weiß ich nicht.
Bitte beachten Sie, dass die obigen Lösungen unter der Annahme korrekt sind, dass die Liniensegmente sich nicht schneiden! Wenn sich die Liniensegmente schneiden, ist klar, dass ihr Abstand 0 sein sollte. Es ist daher notwendig, eine abschließende Überprüfung durchzuführen, die lautet: Angenommen, der Abstand zwischen Punkt A und CD, d (A, CD), war der kleinste der vier genannten Überprüfungen von Dean. Dann mache einen kleinen Schritt entlang des Segments AB von Punkt A. Bezeichne diesen Punkt E. Wenn d (E, CD) & lt; d (A, CD), die Segmente müssen sich schneiden! Beachten Sie, dass Stephen dies nie behandeln wird.
Diese Lösung ist im Wesentlichen die von Alex Martelli, aber ich habe eine Point- und eine LineSegment-Klasse hinzugefügt, um das Lesen zu erleichtern. Ich habe auch die Formatierung angepasst und einige Tests hinzugefügt.
Der Schnittpunkt des Liniensegments ist falsch, scheint aber für die Berechnung der Entfernung von Liniensegmenten keine Rolle zu spielen. Wenn Sie an einem richtigen Liniensegmentschnitt interessiert sind, schauen Sie hier: Wie erkennen Sie, ob sich zwei Liniensegmente schneiden oder nicht?
%Vor%Tags und Links language-agnostic geometry