给定三个共面(2D)点(X1,Y1)、(X2,Y2)和(X3,Y3),它们分别表示(…)"1=我在哪里,2=我在哪里和3=我要去哪里",我需要一个简单的算法来告诉我,例如
- 向右Veer
- 向左转
- 向左转弯
换句话说,(a)是向左或向右转弯;以及(b)转弯有多急(让我武断一点)。
在第一部分中,我已经学习了如何使用(请参阅wikipedia:Graham Scan,这里的问题#26315401)叉积来根据路径是逆时针方向来确定转弯是向左还是向右。
而且,我相信ATAN2()将是决定转弯有多急的核心
但我不能。。相当地把我的头脑放在正确的数学上,它将适用于所有方向。(尤其是当角度越过零线时。(350度到10度的轴承是20度的间隙,而不是340度,等。)
好吧,我累了[…今天早上我的头撞在墙上。]"每次我觉得我得到了它,我都不确定。"所以,好吧,是时候问了…:-)
使用Atn2计算方向变化角度时,不要考虑绝对角度。您不必计算两个方位并将其相减-Atan2可以为您提供范围-Pi..Pi (-180..180)
中的第一个和第二个矢量之间的相对角度(范围可能取决于编程语言)。
x12 = x2-x1
y12 = y2-y1
x23 = x3-x2
y23 = y3-y2
DirChange = Atan2(x12*y23-x23*y12, x12*x23+y12*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|)
想象一下,Ata2用这个角度的正弦和余弦计算角度,不包括公约数(范数的乘积)
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 * x23 + y12* 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.14 radians -8.13 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,对于大多数编程语言来说是正确的。
嗯,我似乎仍然有点问题。
如果这些点在几乎一条直线上彼此相距很远,我会想到"大角度"。例如:
P1:(0.60644,0.30087)。。P2:(0.46093,0.30378)。。P3:(0.19335,0.30087)
X坐标增加,但Y坐标几乎保持不变
x12=-0.1145507..y12=-0.00290698
x23=-0.267578125..y23=0.002906976
(我反转了Y差,因为坐标在象限IV中,其中Y向下增加。)
x=-0.000354855.y=-0.00120083
ans=-106.462(度)
由于这些点几乎是共线的,我预计答案会很小。正如你所看到的,温度超过了106度。