2013-01-17 27 views
3

我有大量的2D線段。我想用 kd-tree結構來表示它們,然後通過線段找到 特定線段。有關如何使用kd-tree做到這一點的任何想法?如何在kd-tree中表示線段

+0

你究竟是什麼意思? (你想要實現的查詢操作)'通過特定線段的線段找到附近... – leemes

+2

@leemes:我將很快添加一張圖片 – niro

+0

你確定「等距標記」(圍繞粗體的東西線應該表明相同的距離)你畫的是那種形狀?它不應該是線兩端的半圓? – leemes

回答

3

段應該位於它相交的每個kd樹葉中。也就是說,假設線段由一對點(p1, p2)表示,則應該在kd樹節點中存儲對此線段的引用。這個線段應該在它通過的每個kd-tree節點中,這部分不同於處理點時,其中每個點只存儲在1 kd樹節點內。

拆分kd樹節點時,可以在水平或垂直線上分割。如果至少有一個端點位於左側子樹中,則線段位於「左側」子樹中。對於正確的子樹同樣如此。

您應該通過做一些類似於線段端點的點查詢來找到附近。也就是說,查看查詢端點附近的所有kd-tree樹葉。

然後,對於這些分檔中的潛在分段,您可以通過查看從查詢端點到候選分段的垂直線的長度來進行精確的長度比較,反之亦然(將候選線端點與查詢進行比較線)。

如何做到這一點的細節在這裏回答:Shortest distance between a point and a line segment。你應該做4次測試,一行到另一行的端點,反之亦然,並取最小值。注意忽略投影點在線段外的情況的距離。

這可以工作,因爲線不曲線,所以兩條線之間的最近點必須位於其中一個端點。

+0

抱歉,我無法確切地得到您的意思。我在kd-tree上很窮。如何在kd-tree中表示線段。我應該將它們轉換爲點來表示kdtree還是?我的意思是什麼將是輸入。 (說實話,如果我遵循爲點數據設計的標準庫函數,那麼我如何使用這個lib函數來處理這種情況?我可以使用它嗎?可憐的術語 – niro

+0

對不起,我很懷疑如何在kd-tree中代表線段,我沒有任何想法做到這一點,我應該只取中點嗎?找到附近的線或者我如何表示線段,即兩個端點與一個數字...可能是我錯誤..任何想法請 – niro

+0

我詳細闡述了一些細節,「附近」的度量標準可能不是你想要的,但是, – yiding

0

你不能實現帶段的kd-tree。 kd-tree是專門爲k向量空間設計的,分段不是向量空間的一部分。想法是kd-tree使用超平面來分割kd-空間,如果你不在kd-向量空間中,那不是理想的。

但是,您需要的可能是Bounding Volume Hierarchy,https://en.wikipedia.org/wiki/Bounding_volume_hierarchy,這是一種用於碰撞檢測的技術。