給定一個點,並且將任意2D實體(圓,多邊形,直線,折線,弧等),沒有人知道現有的戰略到:定位邊界2D實體
確定是否點是由任何實體組合包圍(界定)?我知道在封閉的形狀上進行'內部'測試是很容易的,但這並不總是給我想要的東西 - 特別是嵌套或相交的形狀。
找到圍繞我的點形成閉合多邊形的最小(最接近?)線/實體集合? (想想一個洪水填充,但不依靠顏色)
給定一個點,並且將任意2D實體(圓,多邊形,直線,折線,弧等),沒有人知道現有的戰略到:定位邊界2D實體
確定是否點是由任何實體組合包圍(界定)?我知道在封閉的形狀上進行'內部'測試是很容易的,但這並不總是給我想要的東西 - 特別是嵌套或相交的形狀。
找到圍繞我的點形成閉合多邊形的最小(最接近?)線/實體集合? (想想一個洪水填充,但不依靠顏色)
我已經解決了過去在商業產品中的這個問題。你已經問過關於分析曲線的問題,但是我會更一般性地討論至少兩次可微的曲線。將多邊形作爲一組單獨的線段處理。不需要對曲線進行分割,但是如果您想要,可以稍微調整算法。
此外,您可能希望在Graphics Gems V中查看我的論文10基於矩陣的橢圓幾何以找到您的省略號之間的交點。
基本思想:
「輪廓」是一個拓撲實體。它是在「頂點」連接的「分段」的閉環。
「段」是輪廓在特定方向中使用的一段曲線。
「頂點」是段之間的連接。頂點與平面上的(x,y)位置相關聯,但在同一位置可能有多個頂點,對於在該點處相交的輪廓中的每對分段,都有一個頂點。每個曲線終點(尖刺頂點)或螞蟻遇到的曲線曲線交點都有一個頂點。
輪廓(在此上下文中)不是幾何實體!不要把它看作是飛機上的簡單封閉的道路。螞蟻可能沿着一段,走到最後,並回到它來的方向 - 這被稱爲「刺激」,包括兩個輪廓段,一個用於任一方向。或者它可能沿着曲線段的一個方向,沿着其他曲線漫遊,並沿着該段的另一個方向返回。因此,即使你的曲線組中只有一行從A到B(假設你沒有無限長線),並且你的光線在P點擊了它,你仍然有輪廓V0(P )-V1(A)-V2(P)-V3(B)-V0具有4段V0-V1,V1-V2,V2-V3,V3-V0。請注意,V0和V2是不同的頂點,都位於P.
現在測試您的點是否在輪廓中。
找到你的射線(任何射線源於你的測試點將與)輪廓的交點。我們只需要與輪廓交點的奇偶數(偶數或奇數)。如果奇偶校驗是奇數的,則該點由曲線限定,如果它甚至不是。
因爲雙重穿越的部分對平價沒有貢獻,我們可以忽略它們。這是因爲在雙線段上總是有偶數個交點,因爲它們在輪廓中是兩次。
示例:
考慮這個曲線集。我用的線,所以我不工作太辛苦:
案例1 - 點是無界。虛線箭頭表示輪廓對曲線段的使用。交叉口奇偶校驗的數量是偶數。
案例2 - 該點爲界。射線輪廓相交奇偶校驗是奇數。
下面是可能出現的錯誤:
你不能找到各種數值原因的輪廓。例如,您可能會錯過交叉點,例如兩條曲線在曲線上幾乎相切。您可能會將其視爲單個交叉點,但是當您執行射線交叉點奇偶校驗測試時,您會看到單個交叉點,以便在奇偶校驗不應該時翻轉。
您可能無法計算出足夠的衍生產品以作出正確的轉折決策。在解析幾何的情況下,情況決不應該如此。
你的射線擊中輪廓的頂點(段之間的連接)。 (請注意,有可在單個(X,Y)點是多個頂點。每個這些必須被單獨處理。)
在這種情況下,必須決定是否的傳入和傳出段頂點位於頂點射線的同一側。如果他們在同一方面,平價不受影響。否則,奇偶校驗翻轉。如果其中一條曲線與頂點處的射線相切,則可能需要使用更高的導數來決定。
有很多細節,但你應該能夠處理它們。確保使用空間樹來避免計算不必要的交點。
第二個問題的答案來自於從輪廓中刪除任何雙向遍歷的段。這可能會產生多個子輪廓。其中之一將包含你的觀點。
感謝您的詳細解答 - 這將是最有幫助的。我發現這種方法「受到」所有「內部測試」的一般問題的影響 - 幸好,我認爲我們已經在我們的應用中解決了這些問題。我想沒有有效的方法來找到幾乎相交的片段?我們經常發現,無論是通過手繪,全球定位系統或電子轉換線在計劃中顯然「應該」交叉或加入,往往不會 - 即使它只是一小部分。不過,我們也許可以在每個細分市場周圍使用一個「公差框」來收集這些信息。 – Kyudos
@Kyudos是的,你說得對,我不得不面對同樣的問題。如果您使用空間樹進行細分,只要兩條曲線位於同一個節點中,就可以到達葉節點中有一條曲線的點或小點。如果它們很小,則可以在本地修補拓撲。當然有很多細節。祝你好運! –
再次感謝。對於我們來說,將所有曲線表示爲多段線,然後將每條線段或多段線的末端擴展一個寬度以處理「近相交」,然後開始搜索可能就足夠了。 – Kyudos