【问题标题】:Angle between two lines beginning at one side of the line从线的一侧开始的两条线之间的角度
【发布时间】:2023-03-05 00:13:01
【问题描述】:

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

【问题讨论】:

  • 余弦规则。 a^2 = b^2 + c^2 – 2bc cos(theta)。不过我敢肯定还有更好的想法。

标签: math geometry line pseudocode angle


【解决方案1】:

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

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

这个 z 分量的符号会告诉您角度是大于还是小于 180 度,具体取决于您的方向。

【讨论】:

    【解决方案2】:

    让我们定义一些符号:

    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)

    示例

    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 C在右边。

    现在,在脑海中移动C,对C' 说,并可视化新的红色和绿色矩形。只要C 在右边,不等式就仍然有效。

    还不相信?好吧,编写一个程序,在更改C 的位置时动态再现这张图片,瞧! (或者再学习一些数学并解决书中的练习;)

    注意:请注意,这些矩形有一个标志。在图片中它们都有一个正面区域,但是,一般来说,产品b1*c2b2*c1 都会有一个标志。

    【讨论】:

    • @OliverBorchert 我添加了一张图片,可以帮助您直观地了解正在发生的事情。
    • 很好解释!非常感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多