当您使用 Atan2 计算方向变化角度时,不要担心绝对角度。您不必计算两个方位并将它们相减 - 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|)
想象一下,Atan2 用这个角度的正弦和余弦计算角度,不包括公分母(范数的乘积)
A_B = Atan2(Sin(A_B), Cos(A_B))
德尔福的例子:
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
(右转)