GameDesign 板


LINE

先說一下我對這個規則的理解: 把他當作拿美工刀在紙上割 如果某個區域被割下來的時候,把較小的那個區域丟掉 //////////////// 資料結構: class Face{ Edge top,bottom,left,right; bool removed; }; class Edge{ Face first,second; bool cut; }; 考慮到更複雜的網格時你可能要把Face改成接受不定多數的Edge, 然後再加個Vertex來紀錄Edge間連接的狀況這樣才可以行走。 不過現在要的好像沒這麼複雜,所以使用格子的xy座標和上左方向就好了 //////// 演算法: 當我割了一條新的邊的時候,我需要知道: 有沒有形成新的區域? 檢查方法: 把這個Edge標記為cut 從兩個Face中隨便挑一個,就統一用first好了 開始對first做flood fill 如果fill到了second,代表這條邊沒有產生新的區域,所以可以照常繼續。 如果形成新的區域,接下來的問題就是哪塊比較大: 對first和second各作一次flood fill, 在fill的時候可以用一個counter,每多fill一塊就加1 (更一般的狀況就在Face中紀錄面積,一樣加上去) 最後就可以比較兩邊大小了 (計算大小其實可以在檢蹅新區域的時候就順便做) 最後看哪邊比較小,就再對first或second做一次flood fill, 把那邊所有的Face標為removed (也可以在比大小時就紀錄該區域有哪些face, 不過flood fill其實也沒多慢) 希望對你有幫助 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.171.56.169
1F:→ zop:將圍過的邊都標注cut,還在畫的線標注run,行徑確定產生run之後, 02/27 12:31
2F:→ zop:只要碰上cut,就等於包覆一個區域,同時作兩個區域的flood fill, 02/27 12:32
3F:→ zop:比較之後標注小的區域為removed,然後removed內的cut全部清除, 02/27 12:33
4F:→ zop:只留最外圍的cut,機體只能在cut上還有未removed的區域行走,另 02/27 12:34
5F:→ zop:外,機體碰上run爆炸!(倒退也爆?XD) 02/27 12:35
6F:→ azureblaze:確實檢查前面的邊就可以判斷新區域,免去flood fill 02/27 13:03
7F:推 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)
8F:推 euph:我也有想過你的想法 只是你丟進去的第一個FACE會被countinue 02/27 13:45
9F:→ euph:因為那一個FACE的其中一邊就是CUT 然後就無法遞迴出去 02/27 13:47
10F:→ azureblaze:只有那邊不做,其他三邊還是會處理啊? 02/27 13:50
11F:推 euph:了解 我是以一整個FACE為單位 所以再切割成四個邊進去做檢查 02/27 13:55
12F:→ euph:好 我試著寫看看 感謝 :D 02/27 13:55
13F:推 euph:感謝 我把FACE分成四邊去做檢查再往外遞迴 就沒問題了!! 02/27 19:10
14F:→ euph:大感謝!!! 只是效能有點恐怖就是了 XDDD 02/27 19:10
15F:推 euph:後來我修改了一下 當如果檢查兩邊的時候其中一邊有碰到邊界 02/28 15:48
16F:→ euph:就回傳false這樣可以加速很多不必要的檢查 邊界是只全體的邊 02/28 15:49
17F:→ zop:可是如果是四邊都已經不是原先的邊,會不會判定失效? 02/28 16:45
18F:→ zop:喔,看你敘述,應該是不會 02/28 16:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP