比较两个角度

时间:2010-05-23 14:04:37

标签: math vector geometry

考虑到平面中的四个点A,B,X,Y,我希望确定以下两个角度中的哪一个较小∢ABX∢ABY

角度∢ABX被定义为BX的角度,当AB被翻译为位于开放段(-∞,0]时。直言∢ABX时我的意思是你在访问顶点B后左转时所获得的角度。

我宁愿不使用cossqrt,以保持准确性并最大限度地降低性能(代码可以在嵌入式系统上运行)。

A=(-1,0),B=(0,0)的情况下,我可以通过计算向量∢ABX的点积来比较两个角度∢ABYX,Y,并观察其符号。

在这种情况下我能做的是:

  1. 确定ABX是向右还是向左转
  2. 如果ABX左转,请检查YA是否位于细分BX上一行的同一侧。如果是 - ∢ABX小于ABY
  3. 如果ABX向右转,那么YA位于BX的同一侧意味着∢ABX大于∢ABY
  4. 但这对我来说似乎太复杂了。

    任何更简单的方法?

6 个答案:

答案 0 :(得分:2)

这是一些伪代码。两个角度相同时都不会检测到这种情况。也不涉及角度方向,例如假设所有角度都<= 180度。

v0 = A-B
v1 = X-B
v2 = Y-B

dot1 = dot(v0, v1)
dot2 = dot(v0, v2)

if(dot1 > 0)
  if(dot2 < 0)
    // ABX is smaller
  if(dot1 * dot1 / dot(v1,v1) > dot2 * dot2 / dot(v2, v2) )
    // ABX is smaller
  // ABY is smaller

if(dot2 > 0)
  // ABY is smaller
if(dot1 * dot1 / dot(v1,v1) > dot2 * dot2 / dot(v2,v2) )
  // ABY is smaller
// ABX is smaller

请注意,如果你允许服用两个平方根,那么这种痛苦的痛苦就会消失。

答案 1 :(得分:1)

通过

将原点居中于B
X = X - B
Y = Y - B
A = A - B

编辑:您还需要规范化3个向量

A = A / |A|
X = X / |X|
Y = Y / |Y|

通过

找到两个角度
acos(A dot X)
acos(A dot Y)

===

我不明白精度损失的重点。你只是比较,而不是以任何方式修改点的坐标......

答案 2 :(得分:1)

您可能想查看Rational Trigonometry。距离和角度的概念被四分法和展开所取代,不涉及sqrtcos。请参阅该网页的底部,了解如何计算两条线之间的差异。该主题有自己的网站,甚至是youtube channel

答案 3 :(得分:0)

  

我宁愿不使用cos或sqrt,以保持准确性。

这没有任何意义。

  

但这对我来说似乎太复杂了。

这对我来说似乎是完全错误的。

取两个向量之间的差异,并查看组件的符号。

你必须要小心的是“小”意味着什么。如上所述,这个想法并不十分精确。例如,如果一个点A在象限4中(x分量> 0且y分量<0)并且另一个点B在象限1中(x分量> 0且y分量> 0) ,“小”是什么意思?从原点到A的矢量角在0到π/ 2之间;从原点到B的矢量角度在3π/ 4和2π之间。哪一个“较小”?

答案 4 :(得分:0)

使用余弦定律:a**2 + b**2 - 2*a*b*cos(phi) = c**2

其中a = | ax |,b = | bx | (| by |),c = | ab | (| ay |)和phi是你的角度ABX(ABY)

答案 5 :(得分:0)

我不确定你是否可以在不使用sqrt的情况下离开。 简单:

AB = A-B/|A-B|
XB = X-B/|X-B|
YB = Y-B/|Y-B|

if(dot(XB,AB) > dot (YB,AB)){
 //<ABY is grater
}
else
{
...
}