此处将线定义为一系列2D节点。现在,我有两行A
和B
。
A=[(0, 0), (1, 1), (2.1, 3), (4,7)]
B=[(2, 0), (2, 6)]
当在纸上绘制它们时,人们可以很容易地看到两条线在不的点上相交,该点是A
或B
的节点成员。 / p>
但是,A
和B
确实跨越了这一点。也就是说,这一点确实存在于A
和B
上,只是不与节点点发生碰撞。
我现在希望找到交叉点。
(再次温和提醒:交叉点在A
和B
上,但它可能不是节点)
我现在想出的是使用多项式来拟合每个点序列。通过这种方式,我可以求解与方程的交集。然而,这对我自己来说似乎是一种非常愚蠢的方式。
有没有明智的方法可以这样做?
我说的是Python,但任何通用答案都非常受欢迎。
答案 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)
。
这假设您知道A
和B
不包含内部交叉。 Bentley-Ottman的一个天真的实现(两个线段只是不加选择地处理)将报告所有交叉点,包括自我交叉。