ecto.ru

Детали

JS отражение падающего обьекта

Как известно — угол падения равен углу отражения.
Из этого следует что угол отражения равен:
Lотр = Lнорм + Lнорм - Lпад

Lпад — угол падения
Lотр — угол отражения
Lнорм — угол нормали плоскости отражения

В реальных системах скорость движения при отражении от чего-либо также уменьшается.

Значит для отражения предмета нам необходимо:
 1. пересчитать dx и dy в угол движения и силу
 2. вычислить новый угол движения
 3. уменьшить немного силу
 4. пересчитать обратно силу и угол в dx и dy

Сила движения это гипотенуза треугольника dx и dy:
сила=корень из (dx*dx + dy*dy)

Поскольку существуют тригонометрические формулы для сложения и вычитания углов, мы вычислим угол движения в виде синуса и косинуса:
sin(угла падения) = dy / сила
cos(угла падения) = dx / сила

Угол отражения равен:
sin(L)=sin(Нормали)*cos(падения)-cos(Нормали)*sin(падения);
cos(L)=cos(Нормали)*cos(падения)+sin(Нормали)*sin(падения);

sin(отражения)=sin(L)*cos(Нормали)+cos(L)*sin(Нормали); cos(отражения)=cos(L)*cos(Нормали)-sin(L)*sin(Нормали);

Градусы в программе лучше хранить в виде пары синуса и косинуса, непосредственное значение градуса требуется редко. Например, башня танка повернута на -1563 градуса — не очень удобно. Ктому же это избавит нас от сложных операций вычисления синуса и косинуса от градуса, а эта пара понадобится очень часто, и сильно уменьшит нагрузку программы на процессор и увеличит точность вычислений.

Получить из полученных угла и силы значения dx и dy легко:
dx = cos(угол)*сила dy = sin(угол)*сила

Результат

Comments:

Pen 30.07.2010
отлично!
Yu_K 03.12.2012
Отлично сделано. А вот упругий шарик внутри упругой сферы без силы тяжести — можете нарисовать траектории. Если шарик в главной плоскости движется — то картинка простая http://mathworld.wolfram.com/PonceletsPorism.html