我正在制作一个简单的2d Java游戏,类似于遥测战争。我目前正在为玩家的射击编程。
我有鼠标位置指定的目标点。现在我想加入一点随机化,这样拍摄角度就有了一个随机偏移。我目前正在将这一点直接转换为向量。我的想法是将向量转换成一个角度,将随机化应用于这个角度,然后,将这个角度转换回一个向量(给定向量的长度)。
我不知道怎么把角度转换成矢量。我不需要代码,这基本上只是一个关于数学的问题。如果有更好的方法随机拍摄,我也想听!我不能把随机化应用到这一点上,因为还有其他的东西,然后鼠标就可以设置它。
发布于 2014-12-12 11:36:34
极坐标系
就像每个人刚才在评论中回答的那样,下面是对你的问题的回答,因为它是这样的:你需要使用极坐标系统。
让我们调用您的角度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
相乘,得到想要的东西。
现在我们识别了x=r cos(a)
和y=r sin(a)
,因此我们有了最后的表达式:
如果您想一想,对于b
的小值(这是您想要的),sin(b)
接近0,cos(b)
接近1,因此扰动很小。
你不仅把三角运算的数目从3减少到2,而且你还有一个cos和一个小值的罪恶,如果用Taylor级数计算,这是很好的,使收敛速度非常快。但这取决于实现。
注意:另一种选择(更优雅?)找到相同的结果(以及完全相同的公式)的方法是使用旋转矩阵。
我可以吃鳕鱼
喔,你说你不想要密码。让我们这样做:我不会在这里发布它,但是如果您想与我在编写实现代码之后如何进行比较,您可以在这里看到我的实现:http://ideone.com/zRV4lL
https://stackoverflow.com/questions/27446248
复制相似问题