2017-01-06 174 views
0

我嘗試使用下面的代碼爲Even-Odd Rule from Wikipedia光線投射點多邊形線對齊邊緣

# x, y -- x and y coordinates of point 
# poly -- a list of tuples [(x, y), (x, y), ...] 
def isPointInPath(x, y, poly): 
     num = len(poly) 
     i = 0 
     j = num - 1 
     c = False 
     for i in range(num): 
       if ((poly[i][1] > y) != (poly[j][1] > y)) and \ 
         (x < (poly[j][0] - poly[i][0]) * (y - poly[i][1])/(poly[j][1] - poly[i][1]) + poly[i][0]): 
        c = not c 
       j = i 
     return c 

Unfortuantely,它給我的簡單直線多邊形錯誤的結果時,我的測試點對齊水平邊緣

 ----- 
    | | 
    | x ----| 
    x |--------| 

治療水平邊緣作爲邊緣之一使得視爲內兩個點而忽略了水平邊緣使得視爲外

兩個點210

那麼我怎樣才能使這種多邊形的奇數規則工作?或建議替代算法?

+1

與不是軸對準的光線相交(例如,射線在45度。 – Ante

+0

這是否意味着奇數規則(或任何光線投射算法)對於邊緣與光線投射方向平行的多邊形不起作用?這是一個主要限制,不是嗎? – Woofas

+0

它可以更好地處理光線邊緣重疊。如果光線與邊緣重疊,則需要檢查與邊緣鄰居(前一個和下一個邊緣)的交集。類似的,將光線方向上的下一個邊移動到前一個邊,並檢查光線是否與相連的邊相交或僅觸摸一個點。如果您繪製射線與相連的邊相交。如果幾何形狀爲U形(在右側添加一個部件),則射線只會觸及連接的邊。 – Ante

回答

0

here採取以下規則似乎工作

沿交叉規則

向上的邊緣包括它的起始端點,並排除其最終的終點;

下邊緣排除其起始端點,幷包括其最終端點;

水平邊緣被排除

邊緣射線相交點必須嚴格右側的點P.

注意的是,上述的規則按照慣例

一個點左邊或底邊是內側,右邊或上邊的點是外側。這樣,如果兩個不同的多邊形共享一個共同的邊界線段,那麼該線段上的一個點將位於一個多邊形或另一個多邊形中,但不是同時存在。

此外,作者指出,此方法僅適用於簡單(非自相交)多邊形。 它還建議使用有效實現的卷繞號碼,以更好地處理非簡單多邊形