【问题标题】:Find the the point which is the intersection of two segments [duplicate]找到两个线段的交点[重复]
【发布时间】:2017-09-26 21:00:11
【问题描述】:

我有两个相交的线段 A 和 B(每个由两个点定义)。 X 点是 A 和 B 的交点。 如何找到 X 的坐标?

【问题讨论】:

  • 你真的相信你是第一个提出这个问题的人吗?
  • 没有,但我在 Stack OverFlow 中没有找到简单的答案。
  • 您期望得到什么简单的答案?这个“简单问题”存在一些缺陷,解决方案必须考虑到这些缺陷。

标签: algorithm math geometry graph-algorithm


【解决方案1】:

假设您在分段 A 上的两个点是 (x1, y1)(x2, y2)。这两点足以确定直线方程:

y - y1 = slope.(x - x1) 
where slope is = (y2-y1)/(x2-x1)

因此,使用此技巧,您可以找到段 A 和 B 的方程。对于每个段,这些方程的格式为 y = p_A + q_A x and y = p_B + q_B x

两个线段相交的点(x*, y*)y* = p_A + q_A x*y* = p_B + q_Bx* 的位置,因此p_A + q_A x* = p_B + q_B x*。从这里你有x*,的值,你可以通过在任何段的方程中替换这个x值来找到y*

希望这会有所帮助!

【讨论】:

  • 如果任一段恰好是垂直的(无限斜率),此方法将失败。
【解决方案2】:

我假设您在二维中工作。让我们介绍一些符号。让第一条线段由点定义

P1 = (x1, y1)

P2 = (x2, y2).

第二条线段由点定义

P3 = (x3, y3)

P4 = (x4, y4).

第一条线段上的任意一点都可以用参数表达式来表示

s P1 + (1 - s) P2

其中 s 是一个介于 0 和 1 之间的实数。同样,第二行上的任何点都可以类似地表示为

t P3 + (1 - t) P4.

交点是这两个表达式相等的地方:

s P1 + (1 - s) P2 = t P3 + (1 - t) P4

将其简化为 x 和 y 坐标会在两个未知数中产生两个方程,st。求解 s 和/或 t 然后通过代入原始方程得到交点。

请注意,即使其中一条线段恰好具有无限斜率,使用这样的参数线表示(与计算斜率截距形式的方法不同)也有效。

另外,作为额外的奖励,如果 st 最终超出范围 [0, 1],则两行 segments 不相交(包含线段的线在一个或两个线段之外的某处相交)。最后,如果两个联立方程没有解,则包含两条线段的线是平行的。 (它们甚至可能在同一条线上。区分这种情况,包括线段是否在端点处相遇或部分或完全重叠,留给读者练习。:))

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多