Wo finde ich den Punkt P n, wo die Normale zu AB durch den Punkt P geht? Ich muss auch wissen, ob es keine Norm gibt, die den Punkt passiert (z. B. der Punkt Q).Finde den Punkt entlang der Linie, wo die Normale durch einen anderen Punkt verläuft.
Antwort
Wenn R
irgendein Punkt auf der normalen Linie, die durch P
Passing (verschieden von P
) ist, dann ist der Punkt, wo Pn
AB
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.
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
Sie 2 Antworten haben, egal zu akzeptieren? – gsamaras