我正在尋找一種算法來測試多邊形是否「嚴格」簡單。通常該測試涉及檢查任何多邊形段之間的交集。但在這裏,因爲我想檢查並不總是處於邊緣交叉點的情況,所以我不太確定要查找什麼。 嚴格簡單的多邊形測試(允許有孔)?
在上圖中,B C和D不是簡單的多邊形,但只有D會使相交測試失敗。我的術語(絕對簡單)也許稍微不合適,但我認爲這幅圖解釋了我的意思。
我正在尋找一種算法來測試多邊形是否「嚴格」簡單。通常該測試涉及檢查任何多邊形段之間的交集。但在這裏,因爲我想檢查並不總是處於邊緣交叉點的情況,所以我不太確定要查找什麼。 嚴格簡單的多邊形測試(允許有孔)?
在上圖中,B C和D不是簡單的多邊形,但只有D會使相交測試失敗。我的術語(絕對簡單)也許稍微不合適,但我認爲這幅圖解釋了我的意思。
說兩線相交做,如果他們至少有一個共同點。
取一條邊並計算與任何其他邊的交點。如果它有
所以,你的擔心是毫無根據的:
但在這裏,因爲我要檢查不總是落在下邊緣的邊緣相交的情況下[...]
這種方法也適用於此。
這三類無效多邊形必須單獨檢查。
案例B:
檢查,以確保沒有在您的多邊形沒有重複的頂點。
案例C:
檢查以確保沒有頂點落在任何邊緣上。假設你使用浮點數,這可能會變得棘手,因爲浮點數必須估計爲完全相等。這可以通過說他們不能在對方的某個EPS
之內來繞過,但是這可能使其他一些幾乎無效的多邊形失效。我自己親自使用EPS
,除非我真的需要最高精度(在這一點上,我不知道我會做什麼)。
案例d:
正如你所說,這可以通過檢查任何邊相交找到。
案例E: 兩條邊重疊(相交於無限多個點)並且它們的頂點不重合。
我不確定這是否需要一個單獨的案例,但這種情況可能不會被檢查案例D(我認爲你最終除以零)所捕獲。因此,您還需要檢查兩條邊是否完全對應於同一條線。
我想不出任何其他情況下暫時
只需檢查頂點邊緣交點以及邊緣交點。 – Beta 2012-04-01 19:52:10
如果有實際的交叉點,B和C也應該通過邊交叉檢查。一個角落與邊緣「非常接近」並不算作交叉點,對吧? @Beta:一個點不能與任何東西相交。你什麼意思? – 2012-04-01 19:53:54
您是否在.Net/CLR框架中運行C++? – 2012-04-01 19:54:28