Як обчислити нормальний вектор відрізка лінії?


177

Припустимо, у мене відрізок рядка переходить від (x1, y1) до (x2, y2). Як обчислити нормальний вектор, перпендикулярний до прямої?

Я можу знайти багато речей про те, як це робити для літаків у 3D, але жодного 2D.

Будь ласка, пройдіть математику (вітаються посилання на відпрацьовані приклади, діаграми чи алгоритми), я програміст більше, ніж я математик;)


2
І якщо ви хочете знати про "математику", що стоїть за цим, ви можете шукати мою відповідь на сайті stackoverflow.com/a/7470098/189767 . Це в основному те саме, але більш детально.
Андреас

2
Це питання стосується математики, а не програмування.
Чарлі

1
Я голосую, щоб закрити це питання поза темою, оскільки йдеться про математику, а не про програмування.
Панг

Відповіді:


237

якщо визначити dx = x2-x1 і dy = y2-y1, то нормалами є (-dy, dx) та (dy, -dx).

Зауважте, що ділення не потрібно, і тому ви не ризикуєте ділити нуль.


14
Це досить тонко, і мені знадобився певний час, щоб усвідомити normal.x = -dy та normal.y = dx. У мене було їх навпаки, тому що це виглядало як друкарська помилка, присвоюючи x частину значенню y ...
Piku

@OrenTrutner я досі не розумію цього; (x', y') = (-y, x)і (x', y') = (y, -x)здається, що це правильно, але навіщо це використовувати dxі dyтут. Більше того, на основі нахилів m1 * m2 = -1для прямих кутів ліній, отже, dy' = dx' * (-dx/dy)і dx' = dy' * (-dy/dx)як увійти у ваше рівняння normal.x = x' = -dy?
legends2k

1
Не могли б ви детальніше ознайомитись із тим, як дельта грає тут роль? Я впевнений, що мені чогось тут не вистачає.
legends2k

7
@ legends2k: Дельта - дотичний вектор. Нормальним є напрямок, перпендикулярний дотичній. Перегортання значень x / y та відмова від них стає очевидним, якщо ви подивитеся на 2D матрицю для обертання на 90 градусів: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@geon: Ааа! Зрозумів, я плутав дельту зі схилом, тоді як у афінній геометрії різниця між двома точками - вектор, тут дотик :)
legends2k

95

Інший спосіб подумати над цим - обчислити одиничний вектор для заданого напрямку, а потім застосувати обертання на 90 градусів проти годинникової стрілки, щоб отримати нормальний вектор.

Матричне зображення загального 2D перетворення виглядає приблизно так:

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

де (x, y) - компоненти вихідного вектора і (x ', y') - перетворені компоненти.

Якщо t = 90 градусів, то cos (90) = 0 і sin (90) = 1. Підстановка і множення на це дає:

x' = -y
y' = +x

Той самий результат, що і раніше, але з трохи більше пояснень, звідки він походить.


2
Дякую тоні, зламав мені голову про те, як це виводиться.
legends2k

1
Хоча я знав формулу обертання раніше, за цією відповіддю те, що клацнуло всередині моєї голови, полягало в тому, що кут є постійним (+/- 90), що спрощує його до простого заперечення і перетворення x і y.
legends2k

@duffymo чи результат має довжину одиниці?
Мартін Мізер

Якщо вектор нормалізується до трансформації, він залишиться таким і після. Ви повинні нормалізуватися до або після того, як ви зробите обертальну трансформацію.
duffymo

11

Це питання було розміщено давно, але я знайшов альтернативний спосіб відповісти на нього. Тому я вирішив поділитися цим тут.
По-перше, треба знати, що: якщо два вектори перпендикулярні, їх точковий добуток дорівнює нулю.
Нормальний вектор (x',y')перпендикулярний лінії, що з'єднує (x1,y1)і (x2,y2). Цей рядок має напрямок (x2-x1,y2-y1), або (dx,dy).
Так,

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

Є безліч пар (x ', y'), які задовольняють наведеному рівнянню. Але найкраща пара, яку ВЖЕ завжди задовольняє, це (dy,-dx)або(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

якщо перпендикулярно дві прямі:

m1*m2 = -1

тоді

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 - це щось, якщо ви хочете передати його з визначеної вами точки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.