给出三分表示“轻微右转”的逻辑

问题描述 投票:2回答:3

给出三个共面(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 =我要去的地方,”我需要一个简单的算法,该算法可以告诉...

当您使用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*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,对于大多数编程语言,

是正确的

嗯,我似乎仍然

有点问题。 。 。
如果这些点彼此几乎以一条直线相距很远,那么我想到的是“大角度”。示例:
geometry mapping directions cross-product
3个回答
4
投票
相对角度

0
投票
编辑-以下内容有误。 [[我的原始答复如下...

0
投票

X坐标增加,但Y坐标几乎保持不变。

x12 = -0.145507 .. y12 = -0.00290698

x23 = -0.267578125 .. y23 = 0.002906976

(我反转了Y的差,因为坐标在象限IV中,其中Y向下增加。)>] >>x = -0.000354855 .. y = -0.00120083

ans = -106.462

(度)

由于这些点几乎是共线的,所以我希望答案很小。如您所见,它的高度超过106度。

© www.soinside.com 2019 - 2024. All rights reserved.