Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
你如何计算一个物体与另一个物体之间的角度? - 源码之家

你如何计算一个物体与另一个物体之间的角度?

问题描述:

如何计算一个物体与另一个物体之间的角度,假定您的第一个物体是您的原点,向上的矢量是?我在android和java中遇到了大约六个小时的这个问题,并且没有任何真正的问题或者答案给出了正确的计算方法。你如何计算一个物体与另一个物体之间的角度?

如果问题不是很清楚: 我在屏幕上有一个对象,我想知道从这个对象到屏幕上另一个对象的y轴(或90度)是什么角度。所以如果第一个物体在1,1和第二个物体在2,2,那么角度应该是315.这是因为0度在右边,90度在上面(y轴),180度左边,270度下降。

+0

你可以试试数学堆栈交换站点。 – AHungerArtist 2012-03-09 20:44:00

+0

[叹气]我想你想'arctan',但你的问题很不清楚。 – Beta 2012-03-09 20:45:59

+0

这是题外话题。但答案是[* dot product *](http://en.wikipedia.org/wiki/Dot_product#Geometric_interpretation)。, – 2012-03-09 20:46:04

可能有更优雅的解决方案,但我发现这工作得很好:

float angle = (float)Math.toDegrees(Math.atan2((double)(y1 - y2),(double)(x1 - x2))); 
angle = (angle + 180.0f) % 360.0f; 
angle = 360.0f - angle; 
这可以像做

这给出从0开始,90向上,180向左和270向下的角度。我回答了我自己的问题,因为我花了一天的时间才找到这个问题,而这并不是在互联网上。我希望它能帮助别人。我会在一两天内不回答这个问题,看看是否有人能找到更优雅的解决方案或更好的方式来表达答案。这个答案在java中,并且已经在Android上测试过。

答案是使用dot product,从而:

theta = arccos(a.b/(||a|| ||b||)) 

.其中表示点积,并|| ||表示向量幅度。

所以在你的情况下,你选择a代表“up”(所以可能(0,0,1))和b是你的两点之间的差异。

+0

你如何在android java代码中表达这个? – Lokiare 2012-03-09 21:01:43

+0

@JamesHolloway:我不喜欢给人们完整的编码解决方案。我建议看看我链接的文章;如果您遇到特定问题,请告诉我。 – 2012-03-09 21:03:14

+0

我已经解决了它,但花了这么长时间,我希望能帮助其他人解决正确的答案,所以他们不用花2天的时间就搞清楚。 – Lokiare 2012-03-09 21:56:04

在Java中有一个名为Math.atan2()的函数。这需要一个“向量”。通常你有2点,你需要计算它们之间的角度。

Point p1 = new Point(2,6); 
Point p2 = new Point(3,1); 
double angle = Math.atan2(p2.y-p1.y,p2.x-p1.x); 

Math.atan2返回这里指定的格式结果:Math.atan2

+0

这是2D格式。 3D呢? – 2012-03-09 20:59:17

+0

关闭,但它没有出现正确答案,0度向右90度向上,180度向左和270度向下。它给出了这个反过来,这是没有用的。它也给出了从-180到+180的答案(当转换为度数时)。 – Lokiare 2012-03-09 21:01:02

+0

确实如此。它按照上述文档中的规定返回它。如果结果低于0,则从360中减去结果。这应该给你你需要的东西。 – 2012-03-09 21:55:02