我有一个简单的2D系统,其中速度表示为速度(某个值)和方向(角度)。如果我有一个以给定速度 v 行进的物体,当另一个速度 v 2 作用于它时,我想计算合成速度 v <子> 3 子>
我创建了下面的插图来解释我希望实现的物理系统。速度和角度可能不完全正确,因为我还不知道如何计算它们 - 这是这个问题的症结所在 - 但它们是一个相当接近的准则。
当新的速度 v 2 行为时,是否有优雅的解决方案来计算合成速度 v 3 在 v 旅行的物体上?
请注意,我对数学的理解非常有限,但对编程有很好的理解。我在TypeScript中进行编码,但任何JavaScript,伪代码或非常清晰的解释(没有神秘的数学符号)的答案都是有帮助的。
答案 0 :(得分:4)
最简单的解决方案是转换为笛卡尔坐标,在那里添加坐标,然后转换回极坐标。
转换为笛卡儿:
x = speed * cos(direction)
y = speed * sin(direction)
回到极地:
speed = sqrt(x * x + y * y)
direction = atan2(y, x)
将速度存储在笛卡尔坐标中可能更好。
编辑:使用您的变量名称:v,v2,v3和角度a,a2,a3:
x = v * cos(a)
y = v * sin(a)
x2 = v2 * cos(a2)
y2 = v2 * sin(a2)
x3 = x + x2
y3 = y + y2
v3 = sqrt(x3 * x3 + y3 * y3)
a3 = atan2(y3, x3)
答案 1 :(得分:1)
所以你有一个物体在v1
方向飞行。
为了支持速度,您只需为每个帧/模拟步骤将它们添加到v1
:
var v2;
while(simulation is running){
v1 = v1 + v2;
}
您可以将v1
,v2
表示为包含x
和y
组件的向量。
为了转换您的值,您可以使用Rémi所设想的x = speed * cos(direction)
和y = speed * sin(direction)
。
您的添加内容如下:
v1.x = v1.x + v2.x;
v1.y = v1.y + v2.y;
为了获得矢量的角度,您可以使用公式tan(angle) = y / x
,从而产生
angle = atan(y/x)
相应的JavaScript调用是var angle = atan2(v1.y, v1.x);
。
矢量的长度(=物体的速度)可以用
计算speed = sqrt(v1.x * v1.x + v1.y * v1.y)