2009-08-07 1 views
139

Предположим, что у меня есть отрезок линии, идущий от (x1, y1) до (x2, y2). Как вычислить нормальный вектор, перпендикулярный линии?Как рассчитать нормальный вектор отрезка?

Я могу найти много материала о том, как это сделать для самолетов в 3D, но не для 2D-материалов.

Перейди легко на математике (ссылки на примеры с, диаграммы или алгоритмы приветствуются), я программист больше, чем я математик)

+2

И если вы хотите знать, что это за «математика», вы можете найти мой ответ на http://stackoverflow.com/a/7470098/189767. Это в основном то же самое, но более сложное. – Andreas

+1

Этот вопрос касается математики, а не программирования. – Charlie

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что речь идет о математике, а не о программировании. – Pang

ответ

194

Если мы определим dx = x2-x1 и dy = y2-y1, то нормали будут (-dy, dx) и (dy, -dx).

Обратите внимание, что разделение не требуется, и поэтому вы не рискуете делить на ноль.

+10

Это довольно тонко и потребовалось некоторое время, чтобы реализовать normal.x = -dy и normal.y = dx.Я имел их наоборот, потому что это выглядело как опечатка, назначающая часть x значению y ... – Piku

+1

http://stackoverflow.com/a/7470098/183120 для получения дополнительной математики. – legends2k

+0

@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

6
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.. 

б что-то, если вы хотите, чтобы передать его с точки вы защиту ined

76

Другой способ думать об этом - рассчитать единичный вектор для заданного направления, а затем применить поворот на 90 градусов против часовой стрелки для получения нормального вектора.

Матрица представление общего 2D преобразования выглядит следующим образом:

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

, где (х, у) являются компонентами исходного вектора и (х «у») являются трансформированные компоненты.

Если Т = 90 градусов, а затем соз (90) = 0 и sin (90) = 1. Подставляя и умножив его дает:

x' = -y 
y' = +x 

Тот же результат, как указано выше, но с немного больше объяснение относительно того, откуда оно исходит.

+1

Спасибо, тонна, ломала голову о том, как она добывала. – legends2k

+0

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

+0

@duffymo имеет ли результат один? –

7

Этот вопрос был опубликован много лет назад, но я нашел альтернативный способ ответить на него. Поэтому я решил поделиться им здесь.
Во-первых, нужно знать, что: если два вектора перпендикулярны, их точечный продукт равен нулю.
Обычный вектор (x',y') перпендикулярен к линии, соединяющей (x1,y1) и (x2,y2). Эта линия имеет направление (x2-x1,y2-y1), или (dx,dy).
Так,

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

множество пар (х 'у'), которые удовлетворяют этому уравнению. Но лучшая пара, которая ВСЕГДА удовлетворяет, равна либо (dy,-dx), либо (-dy,dx)