找两个点系列的交点?

时间:2013-11-08 15:59:22

标签: python algorithm

此处将线定义为一系列2D节点。现在,我有两行AB

A=[(0, 0), (1, 1), (2.1, 3), (4,7)]
B=[(2, 0), (2, 6)]

当在纸上绘制它们时,人们可以很容易地看到两条线在的点上相交,该点是AB的节点成员。 / p>

但是,AB 确实跨越了这一点。也就是说,这一点确实存在于AB上,只是不与节点点发生碰撞。

我现在希望找到交叉点。

(再次温和提醒:交叉点在AB上,但它可能不是节点)

我现在想出的是使用多项式来拟合每个点序列。通过这种方式,我可以求解与方程的交集。然而,这对我自己来说似乎是一种非常愚蠢的方式。

有没有明智的方法可以这样做?

我说的是Python,但任何通用答案都非常受欢迎。

3 个答案:

答案 0 :(得分:0)

for i in range(0, len(A), 2):
    line1 = A[i:i+2]
    for j in range(0, len(B), 2):
        line1 = A[j:j+2]
        point_of_intersect = intersection(line1, line2)
        if point_of_intersect:
            print point_of_intersect

其中函数intersection是根据this Wikipedia entry.

定义的

答案 1 :(得分:0)

得到2分X(x1, x2), Y(y1, y2),您可以确定线方程,例如:

(x-x1)/(x2-x1) = (y-y1)/(y2-y1)

对A行和B行执行此操作。

您将获得行

A: y = m1*x+n1
B: y = m2*x+n2

现在,您只需要找到y和x的值,它们与上述两个方程有关。

答案 2 :(得分:0)

如果您的线段很少,那么测试所有可能的线段对是切实可行的,但它不能很好地扩展。

此问题最常见的解决方案是Bentley-Ottman算法。在互联网上搜索伪代码甚至是实现它的库都很容易;它是一个简单的扫描线算法,其执行时间为O( (n + k) log n),其中n是线段的数量(两条线中的线段之和),k是交叉点的数量。如果您只想知道是否有任何交叉点,则可以在找到的第一个交叉点处停止,此时算法将减少到O(n log n)

这假设您知道AB不包含内部交叉。 Bentley-Ottman的一个天真的实现(两个线段只是不加选择地处理)将报告所有交叉点,包括自我交叉。