Javascript 正弦和余弦如何用于碰撞检测?

Javascript 正弦和余弦如何用于碰撞检测?,javascript,math,trigonometry,Javascript,Math,Trigonometry,我正在完成一个教程,使旧的街机游戏突破-你在屏幕底部有一个桨,目标是使移动的球偏转到屏幕顶部的一系列块 计算回弹效应的代码为: ball.dx = ball.speed * Math.sin(angle); ball.dy = - ball.speed * Math.cos(angle); 黄色圆圈代表球: 我把正弦和余弦理解为斜边的比率;我似乎仍然无法理解它们是如何精确计算反弹角的。有人能解释一下,给定一个角度和一个速度值,得到的数字是如何产生反弹时球的方向性的吗?我觉得我缺少了一个简单的

我正在完成一个教程,使旧的街机游戏突破-你在屏幕底部有一个桨,目标是使移动的球偏转到屏幕顶部的一系列块

计算回弹效应的代码为:

ball.dx = ball.speed * Math.sin(angle);
ball.dy = - ball.speed * Math.cos(angle);
黄色圆圈代表球:


我把正弦和余弦理解为斜边的比率;我似乎仍然无法理解它们是如何精确计算反弹角的。有人能解释一下,给定一个角度和一个速度值,得到的数字是如何产生反弹时球的方向性的吗?我觉得我缺少了一个简单的概念性的拼图。

这是矢量相加-添加的X和Y矢量为您提供了新的速度值。 为了更容易理解这里的正反方向是如何工作的,以angel=0度为例。球垂直下落,应该反弹回来:

ball.dx = ball.speed * Math.sin(0); // 0
ball.dy = - ball.speed * Math.cos(0); // 1
所以没有向左或向右移动,速度是一样的,但是垂直方向是相反的,因为负号

这里使用sin和cos可以保持恒定的速度,因为它们的总和总是1


希望这更清楚一点,而不是让人困惑,但我做了一些类似的代码任务,这些任务很容易用基本向量运算解决。

这是向量相加-添加的X和Y向量为您提供了新的速度值。 为了更容易理解这里的正反方向是如何工作的,以angel=0度为例。球垂直下落,应该反弹回来:

ball.dx = ball.speed * Math.sin(0); // 0
ball.dy = - ball.speed * Math.cos(0); // 1
所以没有向左或向右移动,速度是一样的,但是垂直方向是相反的,因为负号

这里使用sin和cos可以保持恒定的速度,因为它们的总和总是1


希望这更清楚一些,而不是让人困惑,但我做了一些类似的代码任务,这些任务很容易用基本向量运算解决。

它们不用于计算回弹角;角度是您所显示内容的输入。它们被用来计算给定角度的矩形的两边,就像你说的,使用斜边的三角关系。阅读一本基础物理书中的牛顿力学章节会对你有很大帮助。有几种方法可以定义函数cos和sin。这里你需要的是单位圆。例如,请参阅:我花了一些时间思考后的理解是,作为输入的角度提供了计算Y值(
ball.dy
)和X值(
ball.dx
)的方法。这两个结果值作为坐标,提供了通过编程在画布上移动球的方法。由于JavaScript函数返回一个介于-1和1之间的值,因此产生的移动效果将相当缓慢,因此我们将斜边乘以
ball.speed
,以增加球移动的速率。我在球场上吗?他们没有被用来计算反弹角度;角度是您所显示内容的输入。它们被用来计算给定角度的矩形的两边,就像你说的,使用斜边的三角关系。阅读一本基础物理书中的牛顿力学章节会对你有很大帮助。有几种方法可以定义函数cos和sin。这里你需要的是单位圆。例如,请参阅:我花了一些时间思考后的理解是,作为输入的角度提供了计算Y值(
ball.dy
)和X值(
ball.dx
)的方法。这两个结果值作为坐标,提供了通过编程在画布上移动球的方法。由于JavaScript函数返回一个介于-1和1之间的值,因此产生的移动效果将相当缓慢,因此我们将斜边乘以
ball.speed
,以增加球移动的速率。我在大概的范围内吗?
这些总的来说是1
不完全是,比这要复杂一些。你得到的是一个恒定的斜边-这意味着速度不变,但这并不意味着与
sin(x)+cos(x)=1
dx+dy=constant
相同。常数是
sqr(dx)+sqr(dy)
。动量守恒是这里的关键思想。
这些总是加起来等于1
,不完全是这样,这有点棘手。你得到的是一个恒定的斜边-这意味着速度不变,但这并不意味着与
sin(x)+cos(x)=1
dx+dy=constant
相同。常数是
sqr(dx)+sqr(dy)
。动量守恒是这里的关键思想。