簡體   English   中英

找到兩點系列的交集?

[英]Find the intersection of two point series?

一條線在此定義為一系列2D節點。 現在,我有兩條這樣的線AB

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

當一個吸引過來在紙上,可以很容易地看到兩條線相交於一點是NOT任一節點構件AB

但是, AB 確實都超過了這一點 也就是說,該點確實位於AB ,只是不與節點相撞。

我現在希望找到相交點。

(再次提醒:交點在AB ,但可能不是節點)

我現在想出的是使用多項式來擬合每個點系列。 這樣,我可以求解方程的交集。 但是,這對我自己來說似乎是一種非常愚蠢的方式。

有什么聰明的方法嗎?

我說的是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)

假定您知道AB不包含內部交叉。 Bentley-Ottman的一個簡單的實現(其中兩組線段被不加區別地處理)將報告所有交叉點,包括自交叉點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM