假設我在網格環境中具有某個多邊形的頂點,如何迭代它包含的每個單元格(包括邊上的那些單元格)?迭代多邊形中的每個點
爲了澄清,我有以下的頂點(算作如果左上爲(0, 0)
):
//each point is [x, y]
var verts = [
[1, 1],
[3, 1],
[3, 2],
[4, 2],
[4, 4],
[0, 4],
[0, 3],
[1, 3]
];
這將定義一個多邊形像這樣:
其中每個綠根據上面的頂點,點是我想要迭代的一個點。頂點沿着多邊形邊緣走向的方向沒有任何圖案,它可以圍繞多邊形順時針或逆時針旋轉。但是,他們會處於有序狀態;也就是說,如果您放下筆並按順序移動到每個頂點,而不擡起,並且它將繪製輪廓而不跨越多邊形。
用例是我從通過畫布API加載的PNG中獲得imageData
。這PNG被分成「區域」,我需要迭代當前「區域」的每個像素。每個「區域」由上面的頂點數組定義。
我嘗試了類似下面的內容,這將創建一個正方形來遍歷數組中每個4個頂點的集合。
for(var v = 0, vl = verts.length - 4; v < vl; ++v) {
//grabbing the minimum X, Y and maximum X, Y to define a square to iterate in
var minX = Math.min(verts[v][0], verts[v + 1][0], verts[v + 2][0], verts[v + 3][0]),
minY = Math.min(verts[v][1], verts[v + 1][1], verts[v + 2][1], verts[v + 3][1]),
maxX = Math.max(verts[v][0], verts[v + 1][0], verts[v + 2][0], verts[v + 3][0]),
maxY = Math.min(verts[v][1], verts[v + 1][1], verts[v + 2][1], verts[v + 3][1]);
for(var x = minX; x < maxX; ++x) {
for(var y = minY; y < maxY; ++y) {
//do my checks on this pixel located at X, Y in the PNG
}
}
}
兩個大問題,雖然:
- 它可以在多邊形內重複點,
- 它可以搶分的多邊形外
我能解決第一通過跟蹤我檢查哪些點來發布,所以我不重複檢查。第二個問題只能通過對每個點執行PointInPoly
檢查來解決,這會使該解決方案比我想要的要重得多。
EDIT
迭代的整個圖像中的每個像素和施加PointInPoly
檢查每個也是不可接受的;它會比上面的算法更慢。
1:你是對的 - 在畫布中迭代像素ImageData,甚至是屏幕外,都是粗糙的。 2:根據列表中的每個4點,你有一堆你正在定義的矩形,然後你通過像素蠻力。相反,爲什麼不嘗試從你的點數據創建最大面積的矩形。這不是一個簡單的解決方案,但是如果你從頂點列表中創建邊界框,並且確保這些邊界框位於這些區域內部,並將這些新框架推入新的數組中,那麼這就是所有內存,然後像素在每個盒子都需要修改。 – Norguard
@Norguard我不認爲我完全理解你在說什麼,或者如何實現它。獲取代碼示例(甚至是僞代碼)的任何方式? – Chad