Голубой,
Вы НЕ ищете нормаль, как определено перекрестным произведением или 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