gpt4 book ai didi

java - 如何将角度转换为 vector

转载 作者:行者123 更新时间:2023-11-29 03:14:34 26 4
gpt4 key购买 nike

我正在制作一个类似于几何 war 的简单 2d Java 游戏。我目前正在为玩家的射击编程。

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

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

最佳答案

极坐标系

正如每个人似乎刚刚在评论中回答的那样,这里是您问题的答案:您需要使用极坐标系。

我们称您的角度为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)

不计算角度

通过使用一些很酷的三角函数公式,我们可以做得更好。我们不需要转到一个角度再回到一个 vector ,我们可以直接修改 vector 的 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,如果它们是根据泰勒级数计算的,这很好,收敛速度非常快。但这取决于实现。

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

我可以吃鳕鱼

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

关于java - 如何将角度转换为 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com