[英]Find the intersection of two point series?
一条线在此定义为一系列2D节点。 现在,我有两条这样的线A
和B
A=[(0, 0), (1, 1), (2.1, 3), (4,7)]
B=[(2, 0), (2, 6)]
当一个吸引过来在纸上,可以很容易地看到两条线相交于一点是NOT任一节点构件A
或B
。
但是, A
和B
确实都超过了这一点 。 也就是说,该点确实位于A
和B
,只是不与节点相撞。
我现在希望找到相交点。
(再次提醒:交点在A
和B
,但可能不是节点)
我现在想出的是使用多项式来拟合每个点系列。 这样,我可以求解方程的交集。 但是,这对我自己来说似乎是一种非常愚蠢的方式。
有什么聪明的方法吗?
我说的是Python,但也欢迎任何一般性答案。
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
根据该Wikipedia条目定义函数intersection
位置。
具有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值即可。
如果您的线段很少,那么测试所有可能的线段对是可行的,但是扩展性不是很好。
解决此问题的最常见方法是Bentley-Ottman算法。 在互联网上搜索伪代码甚至是实现它的库都很容易; 这是一种简单的扫掠线算法,其执行时间为O( (n + k) log n)
,其中n
是线段数(两条线段之和), k
是交点数。 如果只想知道是否有任何路口,则可以在找到的第一个路口处停止,此时算法将减少为O(n log n)
。
假定您知道A
和B
不包含内部交叉。 Bentley-Ottman的一个简单的实现(其中两组线段被不加区别地处理)将报告所有交叉点,包括自交叉点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.