Wie berechne ich den Normalenvektor eines Liniensegments?

176

Angenommen, ich habe ein Liniensegment von (x1, y1) nach (x2, y2). Wie berechne ich den Normalenvektor senkrecht zur Linie?

Ich kann viele Dinge finden, die dies für Flugzeuge in 3D tun, aber keine 2D-Dinge.

Bitte schonen Sie die Mathematik (Links zu Beispielen, Diagrammen oder Algorithmen sind willkommen), ich bin mehr Programmierer als Mathematiker;)

Piku
quelle
2
Und wenn Sie mehr über die "Mathematik" dahinter erfahren möchten, können Sie meine Antwort unter stackoverflow.com/a/7470098/189767 nachschlagen . Es ist im Grunde das gleiche, aber aufwändiger.
Andreas
2
Bei dieser Frage geht es um Mathematik, nicht um Programmierung.
Charlie
1
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, weil es um Mathematik geht, nicht um Programmierung.
Pang

Antworten:

236

Wenn wir dx = x2-x1 und dy = y2-y1 definieren, sind die Normalen (-dy, dx) und (dy, -dx).

Beachten Sie, dass keine Division erforderlich ist und Sie daher nicht riskieren, durch Null zu dividieren.

Oren Trutner
quelle
14
Es ist ziemlich subtil und ich habe eine Weile gebraucht, um normal.x = -dy und normal.y = dx zu realisieren. Ich hatte sie umgekehrt, weil es wie ein Tippfehler aussah, der den x-Teil dem y-Wert zuordnet ...
Piku
@OrenTrutner Ich verstehe das immer noch nicht; (x', y') = (-y, x)und (x', y') = (y, -x)scheint richtig zu sein, aber warum sollte man dxund dyhier verwenden. Darüber hinaus, basierend auf Steigungen, m1 * m2 = -1für rechtwinklige Linien, also dy' = dx' * (-dx/dy)und dx' = dy' * (-dy/dx)wie kommt es in Ihrer Gleichung normal.x = x' = -dy?
Legends2k
1
Könnten Sie bitte kurz erläutern, wie das Delta hier eine Rolle spielt? Ich bin sicher, ich vermisse hier etwas.
Legends2k
7
@ legends2k: Das Delta ist der Tangentenvektor. Die Normale ist die Richtung senkrecht zur Tangente. Das Umdrehen der x / y-Werte und das Negieren eines wird offensichtlich, wenn Sie sich eine 2D-Matrix für eine 90-Grad-Drehung ansehen: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon
@geon: Aah! Verstanden, ich habe Delta mit Steigung verwechselt, während in affiner Geometrie der Unterschied zwischen zwei Punkten ein Vektor ist, der Tanget hier :)
legends2k
95

Eine andere Möglichkeit besteht darin, den Einheitsvektor für eine bestimmte Richtung zu berechnen und dann eine Drehung um 90 Grad gegen den Uhrzeigersinn anzuwenden, um den Normalenvektor zu erhalten.

Die Matrixdarstellung der allgemeinen 2D-Transformation sieht folgendermaßen aus:

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

Dabei sind (x, y) die Komponenten des ursprünglichen Vektors und (x ', y') die transformierten Komponenten.

Wenn t = 90 Grad, dann ist cos (90) = 0 und sin (90) = 1. Einsetzen und Multiplizieren ergibt:

x' = -y
y' = +x

Gleiches Ergebnis wie zuvor angegeben, jedoch mit etwas mehr Erklärung, woher es kommt.

Duffymo
quelle
2
Vielen Dank, ich habe mir den Kopf gebrochen, wie es abgeleitet wurde.
Legends2k
1
Obwohl ich die Rotationsformel früher kannte, war das, was durch diese Antwort in meinem Kopf klickte, dass der Winkel eine Konstante (+/- 90) ist, was es zu einer einfachen Negation und Umkehrung von x und y vereinfacht.
Legends2k
@duffymo hat das Ergebnis eine Länge von eins?
Martin Meeser
Wenn der Vektor vor der Transformation normalisiert wird, bleibt dies auch danach der Fall. Sie müssen entweder vor oder nach der Rotationstransformation normalisieren.
Duffymo
11

Diese Frage wurde vor langer Zeit gestellt, aber ich habe einen alternativen Weg gefunden, sie zu beantworten. Also habe ich beschlossen, es hier zu teilen.
Erstens muss man wissen: Wenn zwei Vektoren senkrecht sind, ist ihr Punktprodukt gleich Null.
Der Normalenvektor (x',y')ist senkrecht zu der Verbindungslinie (x1,y1)und (x2,y2). Diese Linie hat Richtung (x2-x1,y2-y1)oder (dx,dy).
So,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

Es gibt viele Paare (x ', y'), die die obige Gleichung erfüllen. Aber das beste Paar, das IMMER zufrieden stellt, ist entweder (dy,-dx)oder(-dy,dx)

Tu Bui
quelle
7
m1 = (y2 - y1) / (x2 - x1)

wenn senkrecht zwei Linien:

m1*m2 = -1

dann

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

b ist etwas, wenn Sie es von einem von Ihnen definierten Punkt aus übergeben möchten

Ufukgun
quelle