我需要從一個封閉的2D多邊形創建一個二進制位圖,表示爲點列表。你能否指點我一些有效率和足夠簡單的算法來做到這一點,或者更好一些C++代碼?柵格化2D多邊形
非常感謝! PS:我想避免添加一個依賴項到我的項目中。但是,如果您建議使用開放源代碼庫,則始終可以查看代碼,因此它也可能很有用。
我需要從一個封閉的2D多邊形創建一個二進制位圖,表示爲點列表。你能否指點我一些有效率和足夠簡單的算法來做到這一點,或者更好一些C++代碼?柵格化2D多邊形
非常感謝! PS:我想避免添加一個依賴項到我的項目中。但是,如果您建議使用開放源代碼庫,則始終可以查看代碼,因此它也可能很有用。
你想要的神奇的谷歌短語是「非零蜿蜒規則」或「甚至奇怪的多邊形填充」。
參見維基百科的條目:
兩者都非常容易實現,而且足夠快於大多數的目的。隨着一些聰明,他們也可以被製成antialiased。
複雜度爲O(像素區)
可以在Pygame中檢查出的多邊形填充程序。看看draw_fillpoly
函數。
該算法非常簡單。它找出每個段沿Y軸相交的所有位置。對這些交叉點進行排序,然後橫向填充每對交點。
這將處理複雜和相交的形狀,但顯然你可以粉碎這個算法與大量的段。
不太相關,但順便說一句皮特你是令人敬畏的pygame :) – yairchu 2009-08-28 09:27:52
魯棒執行力度參見Darel Rex Finley's Efficient Polygon Fill,或它的Blender's version。
這是一種奇數/偶數填充方法,它支持自相交線,而不需要複雜的代碼來檢測這種情況,並且不依賴繞線(多邊形可以顛倒併產生相同的結果)。
更新,我做了DAREL雷克斯的方法的優化版本,避免遍歷所有座標對於每個y像素。
獨立實現:
雖然增速將可能是指數,從快速測試,其周圍7.5倍更快(11X去除round
呼叫時),利用繪製塗鴉在2540x1600的區域,情況因人而異任意手。
@plinth:對於簡單的多邊形是不是過度殺戮? – yairchu 2009-08-27 14:27:48
什麼是簡單的多邊形? @static_rtti沒有指定多少個點或多邊形總是凸的,因此一個通用的解決方案是正確的答案。 NZW和EO很簡單,適合面向掃描的解決方案等等。 – plinth 2009-08-27 14:31:26
@plinth:謝謝,這正是我一直在尋找的!當你沒有那個魔術短語時,谷歌搜索的東西可能會很棘手:-) – 2009-08-27 15:01:35