如何将角度转换为矢量

fla*_*ker 1 java math vector angle

我正在制作一个类似于 goemetry wars 的简单 2d Java 游戏。我目前正在对玩家的射击进行编程。

我有一个由鼠标位置指定的目标点。现在我想添加一点随机化,让拍摄角度有一个随机偏移。我目前正在直接将点转换为向量。我的想法是将向量转换为角度,将随机化应用于该角度,然后将角度转换回向量(给定向量的长度)。

我不知道如何将角度转换回向量。我不需要代码,它基本上只是一个关于数学的问题。如果有更好的方法来随机拍摄,我也很想听听!我不能将随机化应用于这一点,因为除了鼠标之外还有其他东西可以设置它。

Cim*_*ali 6

极坐标系

由于每个人似乎都刚刚在评论中回答了,因此您的问题的答案是这样的:您需要使用极坐标系。

让我们调用您的角度a,您要添加到它b的角度,因此修改后的角度是a+b

在极坐标系中,您的点由角度a = Math.atan2(y, x)和半径表示r = sqrt(x*x + y*y)。如果只使用角度,则会丢失一些信息,即鼠标与 (0,0) 点的距离。

将从您的极坐标表示背面(角已被修改后)现在是可能的:x = r * Math.cos(a+b)y = r * Math.sin(a+b)

不计算角度

通过使用一些很酷的三角函数公式,我们可以做得更好。我们不需要去一个角度再回到一个向量,我们可以直接修改向量的 x 和 y 值,仍然像你想要的那样改变角度。

请记住,我们要查找x'=r cos(a+b)y'=r sin(a+b)。我们显然会得到以下公式:

触发

现在让我们r在两边乘以得到想要的结果。

触发*r

我们现在认出了x=r cos(a)and y=r sin(a),所以我们有了最终的表达式:

从 x 和 y 触发

如果你仔细想想,对于小的值b(这是你想要的),sin(b)接近于 0,cos(b)接近于 1,所以扰动很小。

您不仅将三角运算的次数从 3 次减少到 2 次,而且还有一个 cos 和一个小值的 sin,如果它们是从泰勒级数计算出来的,这很好,这使得收敛速度非常快。但这取决于实现。

注意:另一种(更优雅的?)找到相同结果(和完全相同的公式)的方法是使用旋转矩阵

我可以伤害鳕鱼

哎呀,你说你不想要代码。好吧,让我们这样做:我不会在这里发布它,但是如果您想与我完成编码实现后的做法进行比较,您可以在此处查看我的操作:http://ideone .com/zRV4lL