Я создаю простой физический движок. Основываясь на некоторых знаниях предшествующего векторного исчисления, я написал здесь этот код, который принимает компоненты x и y вектора мгновенного направления «u» и x и y компонент вектора, который является линией, с которой шар сталкивается с «v» и возвращает двойную «тету», которая является углом между входящим шаром и линией.Вычислительные углы столкновения
private double computeAngle(double uXComponent, double uYComponent,
double vXcomponent, double vYComponent) {
return Math.acos(((uXComponent * uYComponent) + (uYComponent * vYComponent))/(Math.sqrt((uXComponent * uXComponent) + (uYComponent * uYComponent)) * Math.sqrt((vXcomponent * vXcomponent) + (vYComponent * vYComponent))));
}
Программа продолжает использовать этот код для определения новых компонентов скорости.
xVelocity *= Math.cos(theta);
yVelocity *= Math.sin(theta);
Однако если линия ровная т.е. v = < 500, 0> и мяч движется в простой параболической кривой и прыгающий через линию самого первого отскока всегда прямо вверх (xVelocity очень близко 0) , По существу, значение для theta очень близко к pi/2 (ближе, чем действительно должно быть).
Я уверен, что есть лучший способ сделать это потенциально, используя точечный продукт. Может ли кто-нибудь помочь?
Для получения более подробной помощи отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (Минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (короткий, самосохраненный, правильный пример). –
См. Также приведенный подход [здесь] (http://stackoverflow.com/a/25306319/230513). – trashgod