给出三个共面(2D)点(X1,Y1),(X2,Y2)和(X3,Y3),分别表示(...)“ 1 =我在哪里,2 =我在哪里,然后3 =我要去的地方”,我需要一个简单的算法来告诉我,例如
换句话说,(a)是向左转或向右转; (b)转弯有多急(让我对此保持专心)。
对于第一部分,我已经学习了如何使用交叉乘积(请参见Wikipedia:Graham Scan,以及此处的问题号26315401)来确定转弯是基于左还是右。路径是逆时针方向。
而且,我确定ATAN2()将成为确定转弯弯角的核心。
但是我不能..完全..把脑袋包扎在可以在[[all
方向上使用的正确数学上。 (特别是当角度与零线交叉时。(350度到10度的方位角是20度的间隙,而不是340,等等)。)>好吧,我累了。 [...这个早晨,我的头撞在墙上。”“每次我都知道,我不确定。”所以,好了,该问了...:-)给出三个共面(2D)点(X1,Y1),(X2,Y2)和(X3,Y3),分别表示(...)“ 1 =我在哪里,2 =我在哪里,然后3 =我要去的地方,”我需要一个简单的算法,该算法可以告诉...
-Pi..Pi (-180..180)
中的第一和第二矢量之间提供x12 = x2-x1
y12 = y2-y1
x23 = x3-x2
y23 = y3-y2
DirChange = Atan2(x12*y23-x23*y12, x12*y12+x23*y23)
|A| = Sqrt(A.x*A.x + A.y*A.y)
)计算矢量-矢量角度的正弦值:Sin(A_B) = (A x B) / (|A|*|B|)
和通过点(标量)乘积和向量范数的向量-向量角的余弦:
Cos(A_B) = (A * B) / (|A|*|B|)
想象Atan2用这个角度的正弦和余弦计算角度,不包括公分母(范数的乘积)
A_B = Atan2(Sin(A_B), Cos(A_B))
Delphi中的示例:
var P1, P2, P3: TPoint; x12, y12, x23, y23: Integer; DirChange: Double; begin P1 := Point(0, 0); P2 := Point(1, 0); P3 := Point(2, 1); x12 := P2.X - P1.X; y12 := P2.Y - P1.Y; x23 := P3.X - P2.X; y23 := P3.Y - P2.Y; DirChange := Math.ArcTan2(x12 * y23 - x23 * y12, x12 * y12 + x23 * y23); Memo1.Lines.Add(Format('%f radians %f degrees', [DirChange, RadToDeg(DirChange)]));
输出:
0.79 radians 45.00 degrees
(左转)
对于您的示例数据集(1,1),(3,2)和(6,3)
-0.20 radians -11.31 degrees
(向右转)
[尝试使用您的回复时,我没有想到预期的答案。假设要点是:(1,1),(3,2)和(6,3)。向右急转。使用电子表格,我得出:X12 = 2,X23 = 3,Y12 = 1,Y23 = 3,并且ATAN2结果(以度为单位)为101.3。超过90度的非常急转弯。第2行的电子表格公式(列出X1,Y1,X2,Y2,X3,Y3,X12,X23,Y12,Y23和答案)为:
=DEGREES(ATAN2(G2*J2-H2*I2; G2*I2+H2*J2))
((电子表格,OpenOffice,将“ X”列为ATAN2的第一个参数。)
您确定错字在我头上吗?
]而且,作为事实(如此说来,“是的,是!!”
[[(嘿,我实际上是自己说过的。我只是没想到要像那样,把它们交换掉。)
我的电子表格的ATAN2函数版本首先指定了[[X
]参数。大多数编程语言((Delphi,Perl,PHP ...)首先指定Y
,这就是给出(正确!)答案的方式。当我编辑公式,反转参数以满足电子表格的定义时,问题消失了,我能够从(编辑)
答复中复制值。这是校正后的公式,参数已反转:=DEGREES(ATAN2(G2*I2+H2*J2; G2*J2-H2*I2))
^^== X ==^^ ^^== Y ==^^
同样,需要更改公式,因为此电子表格的 ATAN2的实现落后于大多数编程语言实现。最初给出的答案,它首先列出Y,对于大多数编程语言,是正确的
。嗯,我似乎仍然
有点问题。 。 。
X坐标增加,但Y坐标几乎保持不变。
x12 = -0.145507 .. y12 = -0.00290698x23 = -0.267578125 .. y23 = 0.002906976
(我反转了Y的差,因为坐标在象限IV中,其中Y向下增加。)>] >>x = -0.000354855 .. y = -0.00120083
ans = -106.462
(度)
由于这些点几乎是共线的,所以我希望答案很小。如您所见,它的高度超过106度。