Javascript 如何计算球在有角度曲面上反弹时的反射角
我一直在尝试创建“plinko”游戏的纯javascript版本。我没有数学或物理背景,所以我从谷歌/youtube上学到的一切 我试图计算一个球在与一个有角度的表面接触时应该反弹的角度。我已经计算出了球在碰撞时的角度以及它与之接触的线的角度,分别使用反向tan和球与线的速度x和y。然后我通过求两个角度的差来求入射角,根据斯奈尔定律,这应该给我相对于它所影响的线的反射角 然而,在代码中实现了这一点(或者至少我认为我已经实现了),计算出的角度和球的运动方向没有意义。以下是代码中处理该问题的部分:Javascript 如何计算球在有角度曲面上反弹时的反射角,javascript,html,math,physics,angle,Javascript,Html,Math,Physics,Angle,我一直在尝试创建“plinko”游戏的纯javascript版本。我没有数学或物理背景,所以我从谷歌/youtube上学到的一切 我试图计算一个球在与一个有角度的表面接触时应该反弹的角度。我已经计算出了球在碰撞时的角度以及它与之接触的线的角度,分别使用反向tan和球与线的速度x和y。然后我通过求两个角度的差来求入射角,根据斯奈尔定律,这应该给我相对于它所影响的线的反射角 然而,在代码中实现了这一点(或者至少我认为我已经实现了),计算出的角度和球的运动方向没有意义。以下是代码中处理该问题的部分:
var lineVelX = startPos[0] - endPos[0];
var lineVelY = startPos[1] - endPos[1];
var lineAngle = Math.atan(lineVelY / lineVelX) * 180 / Math.PI;
var ballAngle = Math.atan(window[ball].velY / window[ball].velX) * 180 / Math.PI;
var angleOfIncidence = ballAngle - lineAngle;
var newBallAngle = ballAngle - angleOfIncidence;
window[ball].velX = Math.cos(newBallAngle) * 2;
window[ball].velY = Math.sin(newBallAngle) * 2;
希望有人对数学和物理有更深入的了解,能解释我的错误所在
提前感谢您的帮助:)我将首先使用
requestAnimationFrame
而不是setInterval
,并引入“增量时间”的概念,以便您可以正确执行计算。很明显,碰撞检测有点不准确。我建议使用矢量而不是角度。360°(或±180°)处极坐标的不连续性使生活变得更艰难,90°奇数倍处的tan
散度也是如此。@meowgoesthedog我以前一直在研究向量,但我遇到了一些问题,因为我不完全确定如何使用入射向量来计算反射向量。你能解释一下怎么做,或者知道我可以遵循的任何指南吗?向量应该采取什么形式?例如(velx,vely)或(direction,magnity)中的“vectors”我指的是笛卡尔矢量(与您已经使用的极坐标表示法[direction,magnity]
相反)。看看