Kürzeste Entfernung zwischen zwei Liniensegmenten

8

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.

    
Frank 13.05.2010, 04:49
quelle

9 Antworten

3

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).

Diese Seite erklärt ziemlich gut den Algorithmus für die Entfernung zwischen einem Punkt und einer Linie.

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?

    
Dean Harding 13.05.2010, 04:58
quelle
14

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%

    
Fnord 25.09.2013 00:30
quelle
6

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%     
Alex Martelli 13.05.2010 05:31
quelle
1

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%     
Alexandre Giordanelli 24.02.2015 16:43
quelle
1

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.

    
Stephen 29.10.2010 04:57
quelle
0

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.

    
Cashomoto 15.04.2014 22:27
quelle
0

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%     
Martin Thoma 08.08.2014 02:36
quelle
-9

Alle 2D-Linien, sofern sie nicht parallel sind, treffen sich schließlich. Lernen Sie, was gelehrt wird, damit Sie es verstehen, anstatt zu versuchen, dieses spezielle q zu betrügen.

    
mP. 13.05.2010 05:43
quelle

Tags und Links