[英]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.