2010-11-20 21 views
3

Ich bin auf der Suche nach einem Algorithmus (oder dem Namen des Algorithmus), der einen Punkt auf einem Liniensegment finden wird, wenn ein solcher Punkt existiert, das ist eine bestimmte Entfernung entfernt von einem anderen Punkt, nicht auf dem Liniensegment.Punkt auf Linie - Segment Entfernung von einem Punkt

d.h. es existieren drei Punkte A , B, C ; und möglicherweise eine vierte D. Wo AB bildet ein Liniensegment, und Punkt C ist ein weiterer Punkt irgendwo aus dem Liniensegment AB. Finden Sie einen Punkt D, wenn ein solcher Punkt existiert, der auf dem Liniensegment AB erscheint, das ist eine gegebene Entfernung distance weg von Punkt C.

Antwort

5

Schau mal hier: Circle-Line Intersection

C ist die Kreise Mitte und distance ist der Radius.

Beachten Sie, dass es zwei sich ergebende Punkte geben kann und dass Sie überprüfen müssen, ob der Punkt tatsächlich auf Ihrer Linie liegt (oder auf der Linie, die Sie durch Verlängerung erhalten würden).

+0

Dies ist ein guter boolescher Test, um zu prüfen, ob es einen solchen Punkt D gibt. Es sieht jedoch nicht so aus, als würde es mir sagen, was der Punkt (Punkte) D ist/sind. Es sieht auch so aus, als wäre dies eine unendliche Linie, ich brauche ein Liniensegment. Danke, aber für den Vorschlag. – Ryan

5

Ich verbrachte viel zu lange das herauszufinden und konnte nicht scheinen, eine einfache Antwort irgendwo zu finden, also dachte ich, ich würde es hier veröffentlichen und einige Leute eine Menge Zeit sparen. Obwohl der ursprüngliche Beitrag alt ist, wünschte ich mir, jemand hätte vor langer Zeit eine einfache Antwort gepostet. Es hätte mir ein paar Tage des Experimentierens erspart.

public static Point PointFromEndOfLine(Point start, Point end, double distance) 
{ 
    double x = end.X-start.X; 
    double y = end.Y-start.Y; 
    double z = Math.Sqrt(x * x + y * y); //Pathagrean Theorum for Hypotenuse 
    double ratio = distance/z; 
    double deltaX = x * ratio; 
    double deltaY = y * ratio; 

    return new Point(end.X-deltaX, end.Y-deltaY); 
} 

Die Funktion nimmt über einen startpoint (x, y) und ein Endpunkt (x, y) und einen Abstand (vom Endpunkt. Wenn der Abstand negativ ist, wird der zurückgegebene Punkt entlang der jenseits der Endpunkt sein gleiche Linie: Wenn Ihr Abstand größer als der Abstand zwischen startPoint und endPoint ist, befindet sich der Rückkehrpunkt vor Ihrem Startpunkt, aber immer noch auf der gleichen Linie.Wenn Ihr Abstand eine positive Zahl ist und kleiner als der Abstand zwischen startPoint und endPoint ist, Der zurückgegebene Punkt befindet sich auf dem Liniensegment zwischen startPoint und endPoint in "distance" vom Endpunkt.

Der Grund, warum es funktioniert, ist "Ähnliche Dreiecke. Stellen Sie sich ein großes rechtes Dreieck vor. Zeichnen Sie eine Meerenge li ne durch das Dreieck parallel zur X-Achse und die x-, y-, z-Werte Ihres großen Dreiecks und der kleinere, der durch die gezeichnete Linie erzeugt wird, sind proportional zueinander.

Mit anderen Worten: x/X == y/Y == z/Z

hoffe, das hilft jemand aus.

+0

Das sieht nicht so aus, als ob es die ursprüngliche Frage beantwortet. Dies findet einen Punkt, der "Entfernung" von einem der Endpunkte eines Liniensegments entfernt ist, entlang der Linie, die durch die zwei Enden definiert ist; aber die ursprüngliche Frage war, nach einem Punkt zu fragen, der Abstand von einem dritten Punkt entfernt ist, der sich auf dem Liniensegment befinden kann oder auch nicht. –

+0

Genau das, was ich brauchte. – Brent

Verwandte Themen