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;)


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.


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.


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)


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.