Jak obliczyć wektor normalny odcinka linii?

177

Załóżmy, że mam odcinek od (x1, y1) do (x2, y2). Jak obliczyć wektor normalny prostopadły do ​​prostej?

Mogę znaleźć wiele informacji na temat robienia tego dla samolotów w 3D, ale żadnych rzeczy 2D.

Proszę, nie przejmuj się matematyką (linki do sprawdzonych przykładów, diagramów lub algorytmów są mile widziane), bardziej jestem programistą niż matematykiem;)

Piku
źródło
2
A jeśli chcesz się dowiedzieć, jakie kryje się za tym „matematyka”, możesz sprawdzić moją odpowiedź na stackoverflow.com/a/7470098/189767 . Zasadniczo jest taki sam, ale bardziej rozbudowany.
Andreas
2
To pytanie dotyczy matematyki, a nie programowania.
Charlie
1
Głosuję za zamknięciem tego pytania jako niezwiązanego z tematem, ponieważ dotyczy matematyki, a nie programowania.
Pang

Odpowiedzi:

237

jeśli zdefiniujemy dx = x2-x1 i dy = y2-y1, to normalne to (-dy, dx) i (dy, -dx).

Pamiętaj, że dzielenie nie jest wymagane, więc nie ryzykujesz dzielenia przez zero.

Oren Trutner
źródło
14
Jest to dość subtelne i zajęło mi trochę czasu, zanim zdałem sobie sprawę, że normal.x = -dy i normal.y = dx. Miałem je na odwrót, ponieważ wyglądało to na literówkę przypisującą część x do wartości y ...
Piku
@OrenTrutner Nadal tego nie rozumiem; (x', y') = (-y, x)i (x', y') = (y, -x)wydaje się mieć rację, ale po co miałoby się używać dxi dytutaj. Co więcej, w oparciu o nachylenia, m1 * m2 = -1dla prostych kątów, stąd dy' = dx' * (-dx/dy)i dx' = dy' * (-dy/dx)jak przychodzi do twojego równania normal.x = x' = -dy?
legends2k
1
Czy mógłbyś powiedzieć więcej o tym, jaką rolę odgrywa tutaj delta? Jestem pewien, że czegoś tu brakuje.
legends2k
7
@ legends2k: Delta jest wektorem stycznym. Normalna to kierunek prostopadły do ​​stycznej. Odwrócenie wartości x / y i zanegowanie jednej staje się oczywiste, jeśli spojrzysz na matrycę 2D dla obrotu o 90 stopni: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon
@geon: Aa! Rozumiem, myliłem deltę ze spadkiem, podczas gdy w geometrii afinicznej różnica między dwoma punktami jest wektorem, tanget tutaj :)
legends2k
95

Innym sposobem myślenia o tym jest obliczenie wektora jednostkowego dla danego kierunku, a następnie zastosowanie obrotu o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara, aby uzyskać wektor normalny.

Macierzowa reprezentacja ogólnej transformacji 2D wygląda następująco:

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

gdzie (x, y) to składniki oryginalnego wektora, a (x ', y') to przekształcone składniki.

Jeśli t = 90 stopni, to cos (90) = 0 i sin (90) = 1. Podstawienie i pomnożenie daje:

x' = -y
y' = +x

Ten sam wynik, co podany wcześniej, ale z nieco dokładniejszym wyjaśnieniem, skąd pochodzi.

duffymo
źródło
2
Wielkie dzięki, łamałem sobie głowę, jak to się robi.
legends2k
1
Chociaż znałam wcześniej formułę rotacji, to, co kliknęło w mojej głowie, to ta odpowiedź, że kąt jest stałą (+/- 90), co upraszcza go do prostej negacji i odwrócenia x i y.
legends2k
@duffymo czy wynik ma długość jeden?
Martin Meeser
Jeśli wektor jest znormalizowany przed transformacją, pozostanie taki po. Musisz znormalizować albo przed, albo po wykonaniu transformacji rotacyjnej.
duffymo
11

To pytanie zostało opublikowane dawno temu, ale znalazłem alternatywny sposób, aby na nie odpowiedzieć. Postanowiłem więc udostępnić to tutaj.
Po pierwsze, trzeba wiedzieć, że: jeśli dwa wektory są prostopadłe, ich iloczyn skalarny jest równy zero.
Wektor normalny (x',y')jest prostopadły do ​​linii łączącej (x1,y1)i (x2,y2). Ta linia ma kierunek (x2-x1,y2-y1)lub (dx,dy).
Więc,

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

Istnieje wiele par (x ', y'), które spełniają powyższe równanie. Ale najlepsza para, która ZAWSZE satysfakcjonuje, to albo (dy,-dx)albo(-dy,dx)

Tu Bui
źródło
7
m1 = (y2 - y1) / (x2 - x1)

jeśli prostopadłe dwie linie:

m1*m2 = -1

następnie

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 jest czymś, co chcesz przekazać z określonego przez siebie punktu

ufukgun
źródło