2010-11-19 78 views
2

我一直在做一个项目,我必须使用它的凸包,以及格雷厄姆扫描的具体方法。问题已经解决,直到我想分类点的地方。 所以故事是我收集了他们来自类型点的一堆点,它们的坐标是亲戚。意思是它们来自鼠标事件x和y。所以我已经将鼠标位置收集为点的x和y。我想找到与支点相关的角度。有没有人有一段代码来计算该角度? 许多许多感谢,下面的图片是我需要的: Angles over pivote找到与关键点相关的点的角度

回答

7

使用

Math.atan2(dy, dx) 

其中dydx代表点和支点之间的垂直和水平的差异。

的几个注意事项要牢记:

  • 参考(0弧度)根据约定指向右侧,而不是左侧为你的形象。如果你真的想从左边测量它,你必须做Math.PI - angle转换它。

  • Math -trigonometry函数以弧度表示。要将结果转换为度数,可以使用Math.toDegrees

  • 在数学世界中,增加的y值指向上。在你的形象中,他们指向下方。

+0

在先进的感谢算法的工作非常出色,只是你提到的问题是因为Java计算在Y从屏幕的左上角开始,当向下移动时,y增加,如果我得到角度的绝对值,那么它是完美的。 非常感谢您的帮助。 – user435245 2010-11-19 13:25:24

+0

嗯。尽管我不会在角度上使用Math.abs。然后'-45'和'+ 45'看起来一样。如果您想消除负角度,请尝试使用“+ 360”和“%360”。 – aioobe 2010-11-19 13:28:35

1

获得从连接的任何两个点的线的水平角度P1 & P2: 角度= ATAN((p1.y - p2.y)/(p1.x - p2.x)

所以,你的黑色角= ATAN((454-243)/(286-108)) 注:反转作为y轴的ý符号开始于左上方,而不是左下

角将以弧度转换为度(180/pi)

+0

请注意,通过使用'atan',您需要手动计算角度位于哪个象限。 (例如,“(454-243)/(286-108)'看起来与点颠倒时相同:'(243-454)/(108-286)'。)'Math.atan2'可以采用关心这个给你。 – aioobe 2010-11-19 13:10:48

2

我会用th e的双重定义dot product来计算这一点,因为你跳过了垂直线发生什么的讨厌点,并处理象限

(请原谅我的记数法,因为数学在降价中效果不佳... )

ABxy部件二维矢量,和theta是它们之间的角度:

dot(A, B) = ax * bx + ay * by 

dot(A, B) = |A| * |B| * cos(theta) 

...其中|A|A的长度,可与Pythagorean theorem计算:

|A| = sqrt(ax^2 + ay^2) 

因此:

theta = acos((ax * bx + ay * by)/(|A| * |B|)) 
+1

“,因为你跳过垂直线发生的问题”,或者,他可以简单地使用'Math.atan2'来为他处理这件事。 – aioobe 2010-11-19 13:22:14