从线的一侧开始的两条线之间的角度

Angle between two lines beginning at one side of the line

我有两条线,分别由 x 和 y 坐标的两个点指定。第一点(线开始的地方) 等于 意味着我有 3 个点 A、B 和 C,其中一条线从 A 到 B,另一条线从 A 到 C。我然后会想要计算从第一条线 右侧开始的两条线 之间的角度。结果不需要准确我实际上只需要知道这个角度是大于还是小于 180°(π弧度)。感谢您的帮助 - 您无需编写任何代码,伪代码 and/or 解释会很棒。

看看 vector product 。如果计算线段 AB 和 AC 的 3D 矢量,它们的 z 分量都为零。

因为向量 AB 和 AC 位于 xy 平面内,它们向量积的唯一可能的非零分量是 z 分量 - 所以这是您需要计算的唯一分量。

此 z 分量的 符号 会根据您的方向告诉您角度是大于还是小于 180 度。

让我们定义一些符号:

A := (a1, a1).
B := (b1, b2).
C := (c1, c2).

则矩阵的行列式D

1 a1 a2
1 b1 b2
1 c1 c2

确定 C 位于定向线 AB 的左侧还是右侧 [cf.计算几何 - Berg、van Kreveld、Overmars、Schwarzkopf - 第 1 章,练习 1.4 a)]

现在,您可以从第 2 行和第 3 行减去第 1 行:

1 a1     a2
0 b1-a1 b2-a2
0 c1-a1 c2-a2

并从第一列计算D得到:

(b1-a1)*(c2-a2) > (c1-a1)*(b2-a2)

作为表示C是否在AC左边的条件。当然,右侧卧(resp. left)意味着角度<180(resp. > 180)

例子

A = (0, 0)
B = (0, 1)
C = (1, 0)

那么AB就是垂直线段(y轴),C明显在它的右边。条件

(b1-a1)*(c2-a2) > (c1-a1)*(b2-a2)           ineq(1)

变为:

0 > 1

false,意思是 C 不在 AB 的左边(如预期的那样)

可视化

为了可视化条件,我们可以平移三个点 ABC,直到 A 变为 (0,0)。这是一个无害的转换,因为 ineq(1) 中的条件从 BC 的坐标中减去 a1a2。通过这种翻译,ineq(1) 变为:

b1*c2 > c1*b2                              ineq(2)

现在,让我们想象一下这三个点(暂时忽略与 C' = (c'1, c'2) 相关的棕色线):

乘积b1*c2是红色矩形的面积。乘积 c1*b2 是绿色矩形的面积。图片显示RED < GREEN表示C在右边。

现在,在心里移动 C,对 C' 说,想象新的红色和绿色矩形。只要 C 在右边,不等式就一直有效。

还不信服?好吧,编写一个程序,在您更改 C 的位置时动态重现此图片,瞧! (或者多学点数学,解决书上的习题;)

注意:注意这些矩形有一个标志。图中他们都有一个正的面积,不过一般来说,乘积b1*c2b2*c1都会有一个符号。