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

时间:2015-05-23 13:10:10

标签: math geometry line pseudocode angle

我有两条线指定了两条线,每条线都有x和y坐标。第一个点(行开始的地方)相等意味着我有3个点A,B和C,其中一行是从A到B而另一行是从A到C.我想要计算从第一行右侧开始的两条线之间的角度。结果不一定准确我实际上只需要知道这个角度更大更小是否超过180°(π弧度)。感谢您的帮助 - 您无需编写任何代码,伪代码和/或解释就会很棒。

2 个答案:

答案 0 :(得分:4)

让我们定义一些符号:

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

然后是矩阵的行列式D

1 a1 a2
1 b1 b2
1 c1 c2

确定C是否位于有向线AB的左侧或右侧[参见计算几何 - 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左侧的条件。当然,躺在右边(左边)意味着角度<1。 180(相应的> 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)中的条件从a1a2的坐标中减去BC。通过这种翻译,ineq(1)变为:

b1*c2 > c1*b2                              ineq(2)

现在,让我们想象三点(暂时忽略相对于C' = (c'1, c'2)的棕色线条):

enter image description here

产品b1*c2是RED矩形的区域。产品c1*b2是GREEN矩形的区域。图为RED&lt; GREEN表示C在右侧。

现在,精神上移动C,对C'说,并可视化新的红色和绿色矩形。只要C位于右侧,不平等就仍然有效。

还不确定吗?好吧,编写一个程序,在你改变C的位置时动态再现这张图片,瞧! (或者学习更多的数学并解决这本书的练习;)

注意:请注意,这些矩形有一个符号。在图片中,它们都有一个积极的区域,但是,一般来说,产品b1*c2b2*c1会有一个符号。

答案 1 :(得分:1)

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

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

此z组件的符号将告诉您角度是否大于或小于180度,具体取决于您的方向。