如何将角度转换为矢量

时间:2014-12-12 14:55:14

标签: java math vector angle

我正在制作一个类似于goemetry战争的简单2D游戏。我目前正在为玩家的拍摄编程。

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

我无法弄清楚如何将角度转换回矢量。我不需要代码,它基本上只是一个关于数学的问题。 如果有更好的随机拍摄方式,我也很乐意听到!我不能将随机化应用到这一点,因为鼠标可以设置其他东西。

1 个答案:

答案 0 :(得分:4)

极坐标系

正如大家似乎刚刚在评论中回答的那样,这里是你的问题的答案,因为它已经制定:你需要使用极坐标系。

让我们调用您的角度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)。我们显然会有以下公式:

trig

现在让我们在两边乘以r来得到你想要的东西。

trig*r

我们现在认出x=r cos(a)y=r sin(a),因此我们有最终的表达方式:

trig from x and y

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

你不仅可以将三角运算的数量从3减少到2,而且还有一个cos值和一个小值的sin,如果它们是从Taylor系列计算出来的话很好,会使收敛速度非常快。但那依赖于实现。

注意:找到相同结果(以及完全相同的公式)的另一种方法(更优雅?)是使用rotation matrix

我可以鳕鱼

Whoopsie,你说你不想要代码。好吧,让我们这样做:我不在这里发布,但是如果你想在完成实施编码后我将如何比较,你可以在这里看到我的行动:http://ideone.com/zRV4lL