考虑到平面中的四个点A,B,X,Y
,我希望确定以下两个角度中的哪一个较小∢ABX
或∢ABY
。
角度∢ABX
被定义为BX
的角度,当AB
被翻译为位于开放段(-∞,0]
时。直言∢ABX
时我的意思是你在访问顶点B
后左转时所获得的角度。
我宁愿不使用cos
或sqrt
,以保持准确性并最大限度地降低性能(代码可以在嵌入式系统上运行)。
在A=(-1,0),B=(0,0)
的情况下,我可以通过计算向量∢ABX
的点积来比较两个角度∢ABY
和X,Y
,并观察其符号。
在这种情况下我能做的是:
ABX
是向右还是向左转ABX
左转,请检查Y
和A
是否位于细分BX
上一行的同一侧。如果是 - ∢ABX
小于ABY
。ABX
向右转,那么Y
和A
位于BX
的同一侧意味着∢ABX
大于∢ABY
。 但这对我来说似乎太复杂了。
任何更简单的方法?
答案 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)
通过
将原点居中于BX = 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。距离和角度的概念被四分法和展开所取代,不涉及sqrt
和cos
。请参阅该网页的底部,了解如何计算两条线之间的差异。该主题有自己的网站,甚至是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
{
...
}