从线的一侧开始的两条线之间的角度
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
的左边(如预期的那样)
可视化
为了可视化条件,我们可以平移三个点 A
、B
和 C
,直到 A
变为 (0,0)
。这是一个无害的转换,因为 ineq(1) 中的条件从 B
和 C
的坐标中减去 a1
和 a2
。通过这种翻译,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*c2
和b2*c1
都会有一个符号。
我有两条线,分别由 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
的左边(如预期的那样)
可视化
为了可视化条件,我们可以平移三个点 A
、B
和 C
,直到 A
变为 (0,0)
。这是一个无害的转换,因为 ineq(1) 中的条件从 B
和 C
的坐标中减去 a1
和 a2
。通过这种翻译,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*c2
和b2*c1
都会有一个符号。