2016-05-12 17 views

Antwort

1

Wenn Rirgendein Punkt auf der normalen Linie, die durch P Passing (verschieden von P) ist, dann ist der Punkt, wo PnAB und PR schneiden.

Eine Möglichkeit Punkt zu erzeugen ist R Segment AB um 90 Grad zu drehen und dann zu übersetzen, so dass A mit P zusammenfällt. Die Übersetzte B ist Ihr R:

Rx = Px + (By - Ay) 
Ry = Py - (Bx - Ax) 

Sobald Sie Ihren Punkt haben R, wird es ein einfaches line-line intersection problem, die Ihnen Ihre Pn (die Formeln kann für einen speziellen Fall von senkrechten Linien vereinfacht werden).

Dann können Sie einfach überprüfen, ob Pn zwischen A und B liegt oder nicht.

P.S. Beachten Sie, dass die Lösung, die in @ MBos Antwort bereitgestellt wird, direkter und effizienter ist (und wenn Sie die Formeln kombinieren und vereinfachen/optimieren, die für meine Antwort erforderlich sind, werden Sie schließlich zu demselben Ergebnis kommen). Was ich oben beschrieben könnte sinnvoll sein, wenn Sie bereits eine primitive Funktion, die den Schnittpunkt zweier Linien berechnet, sagen wir,

find_intersection(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy) 
// Intersect AB and CD 

In diesem Fall finden Pn wird eine einfache Einzeiler

Pn = find_intersection(Ax, Ay, Bx, By, Px, Py, Px + (By - Ay), Py - (Bx - Ax)) 

Aber wenn Sie nicht über solch primitive Funktionen verfügen und/oder dafür sorgen, dass Ihr Code effizienter wird, dann sollten Sie sich für eine direktere Sequenz von Berechnungen entscheiden, wie die in @ MBos Antwort.

1

Suche Vektoren

AB = (B.X-A.X, B.Y-A.Y) 
AP = (P.X-A.X, P.Y-A.Y) 

Projektion von P zu AB ist:

APn = AB * (AB.dot.AP)/(AB.dot.AB); 

wo .dot. Skalar Produkt

In Koordinaten:

cf = ((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/((B.X-A.X)^2+(B.Y-A.Y)^2) 

if cf < 0 or cf > 1 then projection lies outside AB segment 

Pn.X = A.X + (B.X-A.X) * cf 
Pn.Y = A.Y + (B.Y-A.Y) * cf 
Verwandte Themen