→ zop:將圍過的邊都標注cut,還在畫的線標注run,行徑確定產生run之後, 02/27 12:31
→ zop:只要碰上cut,就等於包覆一個區域,同時作兩個區域的flood fill, 02/27 12:32
→ zop:比較之後標注小的區域為removed,然後removed內的cut全部清除, 02/27 12:33
→ zop:只留最外圍的cut,機體只能在cut上還有未removed的區域行走,另 02/27 12:34
→ zop:外,機體碰上run爆炸!(倒退也爆?XD) 02/27 12:35
→ azureblaze:確實檢查前面的邊就可以判斷新區域,免去flood fill 02/27 13:03
推 euph:感謝您的討論 我也想過類似的方法 不過在做FF的時候 要怎麼判 02/27 13:09
void FloodFill( Face f,byRef int area){
f.flag();
area += 1;
foreach(Edge e in f.edges){
if(e.cut) continue; //邊被切過了不用處理
Face n = e.getNeighbor(f); //取得跟這個邊相接的另外一個面
if(n.removed) continue; //面被切掉了不用處理
if(n.flaged()) continue; //面被處理過了
FloodFill(n,area);
}
}
//while new region created if Edge e is added:
FloodFill(e.first,areaFirst);
ClearFaceFlags();
FloodFill(e.second,areaSecond);
ClearFaceFlags();
if(areaFirst > areaSecond){
FloodFillRemove(e.first);
}else{
...
}
※ 編輯: azureblaze 來自: 1.171.56.169 (02/27 13:35)
推 euph:我也有想過你的想法 只是你丟進去的第一個FACE會被countinue 02/27 13:45
→ euph:因為那一個FACE的其中一邊就是CUT 然後就無法遞迴出去 02/27 13:47
→ azureblaze:只有那邊不做,其他三邊還是會處理啊? 02/27 13:50
推 euph:了解 我是以一整個FACE為單位 所以再切割成四個邊進去做檢查 02/27 13:55
→ euph:好 我試著寫看看 感謝 :D 02/27 13:55
推 euph:感謝 我把FACE分成四邊去做檢查再往外遞迴 就沒問題了!! 02/27 19:10
→ euph:大感謝!!! 只是效能有點恐怖就是了 XDDD 02/27 19:10
推 euph:後來我修改了一下 當如果檢查兩邊的時候其中一邊有碰到邊界 02/28 15:48
→ euph:就回傳false這樣可以加速很多不必要的檢查 邊界是只全體的邊 02/28 15:49
→ zop:可是如果是四邊都已經不是原先的邊,會不會判定失效? 02/28 16:45
→ zop:喔,看你敘述,應該是不會 02/28 16:45