Как известно — угол падения равен углу отражения.
Из этого следует что угол отражения равен:
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: