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那麼我怎樣才能使這種多邊形的奇數規則工作?或建議替代算法?
與不是軸對準的光線相交(例如,射線在45度。 – Ante
這是否意味着奇數規則(或任何光線投射算法)對於邊緣與光線投射方向平行的多邊形不起作用?這是一個主要限制,不是嗎? – Woofas
它可以更好地處理光線邊緣重疊。如果光線與邊緣重疊,則需要檢查與邊緣鄰居(前一個和下一個邊緣)的交集。類似的,將光線方向上的下一個邊移動到前一個邊,並檢查光線是否與相連的邊相交或僅觸摸一個點。如果您繪製射線與相連的邊相交。如果幾何形狀爲U形(在右側添加一個部件),則射線只會觸及連接的邊。 – Ante