Как рассчитать нормаль? - PullRequest
1 голос
/ 29 марта 2011

Хорошо, скажем, у меня есть прямоугольник (это все 2d), сделанный из x, y, ширины и высоты в Thing A.Как бы я посчитал это нормально?

Ответы [ 8 ]

4 голосов
/ 29 марта 2011

Голубой,

Вы НЕ ищете нормаль, как определено перекрестным произведением или 3 измерениями.Одна минута, и я объясню ..

РЕДАКТИРОВАТЬ:

С этот ответ , очевидно, что вы ищете простовектор перпендикулярный линии.Не вектор, перпендикулярный плоскости.

Для математической оценки

R = A - 2<A, N> N

Сначала вы должны иметь четкое представление о евклидовом векторе .

Дан вектор A (ваш угол падения):

A = <ax, ay> 

Дан вектор B (который представляет вектор отскакивающей стены):

B = <bx, by>

Нормаль (перпендикулярно), чтобы этот вектор просто поворачивался на 90 градусов.Математически:

N = <nx, ny> = <-bx, by>

Следовательно, R =

R = A - 2<A, N> N = ...

Давайте сначала оценим произведение точек

<A, N> = ax*nx + ay*ny = ax*(-bx) + ay*by = ay*by - ax*bx

Затем:

R = <ax, ay> - 2*(ay*by - ax*bx) * N
  = <ax, by> - <2*(ay*by - ax*bx)*nx, 2*(ay*by - ax*bx)*ny>
  = <ax, by> - <2*(ay*by - ax*bx)*(-bx), 2*(ay*by - ax*bx)*(by)>
  = < ax + 2*bx*(ay*by - ax*bx), ay - 2*by*(ay*by - ax*bx) >

Итаквсе, что вам нужно сделать, это определить вектор, представляющий стену, от которой вы отскакиваете (это B), и ваш вектор инцидента (который является A).

РЕДАКТИРОВАТЬ (из-за комментария):

Вы действительно должны потратить время на просмотр ссылки, которую я разместил на евклидовы векторы ...

БазовыйИдея в том, что вы определяете произвольное математическое происхождение.(Скажем, к примеру, и низ твоей стены).Вектор, представляющий вашу стену, - это просто стрелка сверху вниз (или снизу вверх).С началом координат, описанным у основания, эта стрелка будет указывать 0 единиц в направлении x, но 100 единиц в направлении y.Поэтому ваш вектор для стены (B) просто:

B = < 0, 100 >

(Обратите внимание, что ширина вашей стены не важна - она ​​будет подпрыгивать так же, как у стены толщиной 1px, толщиной 50 px или толщиной 100px)).

Но вы захотите нормализовать этот вектор, чтобы он имел единичную величину (длина 1).Таким образом, вектор становится:

B = <0, 1>

Это следует из:

Vector length = sqrt( bx^2 + by^2 ) = sqrt( 0^2 + 1^2 ) = 1

N тогда:

N = <1, 0>  // for the left hand side wall
N = <-1, 0> // for the right hand side wall
2 голосов
/ 29 марта 2011

Если под "нормальным" вы подразумеваете перпендикулярный вектор, взгляните на перекрестное произведение : для векторов

<a1, a2, a3>

и

<b1, b2, b3>

перекрестное произведение равно

<a2 * b3 - b2 * a3, a1 * b3 - b1 * a3, a1 * b2 - b1 * a2>

... но "обычный" в чистом 2D не имеет особого смысла.

1 голос
/ 29 марта 2011

Будь осторожен. Прямоугольник имеет две возможные нормали:

enter image description here

В самолете 4 нормали:

enter image description here

1 голос
/ 29 марта 2011

Перейти Google 'Cross Product'. (http://en.wikipedia.org/wiki/Cross_product)

Возьмите векторы, которые определяют края вашего прямоугольника, как векторы, которые вы пытаетесь пересечь.

0 голосов
/ 29 марта 2011

Нормаль в 2D - это вектор, который повернул объект на 90 градусов в противоположном направлении от объекта, который должен попасть в него.

Для этих нормалей есть фиксированные значения:

Запад (1, 0); Восток (-1, 0); Север (0, -1); Юг (0, 1);

0 голосов
/ 29 марта 2011

То, что ищет cyanprime, является нормалью из 1 строки в 2D-пространстве.

Эта нормаль должна удовлетворять следующему условию:

m_line * m_normal = -1

тогда как m_line - это величина линии, а m_normal - это величина нормали.

=> m_normal = -1 / m_line

Очевидно, что выдает ошибки, если m_line = 0. Таким образом, вы захотитеспециально для этого случая.

Если m_line не равно 0, вы получите ваш 2D-вектор

normal_vector = (1, m_normal)

0 голосов
/ 29 марта 2011

Нормаль ко всему прямоугольнику будет перпендикулярна плоскости прямоугольника (вдоль третьего измерения).

Если вы имеете в виду нормаль к стороне прямоугольника (но в той же плоскости, что и прямоугольник), то вы можете вычислить наклоны сторон, и наклон нормали будет отрицательным обратным наклона стороны, к которой это нормально. (Или не определено, если наклон стороны равен нулю.) Если вы хотите поместить этот нормаль в прямоугольник, средняя точка стороны является хорошим местом для него.

0 голосов
/ 29 марта 2011

Хорошо, если ваш прямоугольник находится на плоскости XY, то нормаль равна (0,0,1). Нет необходимости в алгебре!

...