我有两条线指定了两条线,每条线都有x和y坐标。第一个点(行开始的地方)相等意味着我有3个点A,B和C,其中一行是从A到B而另一行是从A到C.我想要计算从第一行右侧开始的两条线之间的角度。结果不一定准确我实际上只需要知道这个角度更大或更小是否超过180°(π弧度)。感谢您的帮助 - 您无需编写任何代码,伪代码和/或解释就会很棒。
答案 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
左侧(正如预期的那样)
<强>可视化强>
为了可视化条件,我们可以翻译三个点A
,B
和C
,直到A
变为(0,0)
。这是一个无害的转换,因为ineq(1)中的条件从a1
和a2
的坐标中减去B
和C
。通过这种翻译,ineq(1)变为:
b1*c2 > c1*b2 ineq(2)
现在,让我们想象三点(暂时忽略相对于C' = (c'1, c'2)
的棕色线条):
产品b1*c2
是RED矩形的区域。产品c1*b2
是GREEN矩形的区域。图为RED&lt; GREEN表示C
在右侧。
现在,精神上移动C
,对C'
说,并可视化新的红色和绿色矩形。只要C
位于右侧,不平等就仍然有效。
还不确定吗?好吧,编写一个程序,在你改变C
的位置时动态再现这张图片,瞧! (或者学习更多的数学并解决这本书的练习;)
注意:请注意,这些矩形有一个符号。在图片中,它们都有一个积极的区域,但是,一般来说,产品b1*c2
和b2*c1
会有一个符号。
答案 1 :(得分:1)
看看vector product。如果计算线段AB和AC的3D矢量,它们都将具有零z分量。
因为向量AB和AC位于xy平面中,所以它们的向量积中唯一可能的非零分量是z分量 - 因此这是您需要计算的唯一分量。
此z组件的符号将告诉您角度是否大于或小于180度,具体取决于您的方向。