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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP