我确实有以下问题要解决:我有一个简单但大的网格图(大小:mX-times-mY)。我只区分被障碍物占据或自由的瓷砖。
现在假设我使用了一个相对较小的滑动窗口,大小为 n-times-n,所以 n << mX,n << mY。对于该 n 次 n 窗口中所有可能的占用和空闲图块组合,我分配了一个标识符(我们只是说一个数字)。然后我以那个窗口的大小对我的大地图的一部分进行“快照”。
我的问题:确定从地图中提取的当前模式的识别号最简单和/或最快的方法是什么?
演示:我有一个 2x2 窗口(所以是 2x2 矩阵)。有 2^(2x2)=16 种可能的模式组合。
Pattern #1 #2 #3 #4 #5 #6 #7 #8
00 #0 0# 00 00 ## #0 00
00 00 00 #0 0# 00 #0 ##
Pattern #9 #10 #11 #12 #13 #14 #15 #16
0# #0 0# 0# #0 ## ## ##
0# 0# #0 ## ## 0# #0 ##
with # = obscured
0 = free
假设我提取模式
#0
0#
从我的地图中,我怎样才能轻松快速地确定这是上面示例中的模式编号 10?
到目前为止我的想法:
1:简单循环
循环遍历所有模式,直到找到正确的模式,可能通过检查两种模式的差异是否为零矩阵。
2:使用 Row-Sum 和 Column-Sum 作为标识符
我对所有 n 行和所有 n 列求和,并将这些总和用作多维数组中的子索引。对于上面的例子: sumRow1 = 1 sumRow2 = 1 sumCol1 = 1 sumCol2 = 1 所以我的模式被保存在 patternNumbers[1][1][1][1] = 10 中。另一个例子是模式 16,它将被保存在模式编号[2][2][2][2] = 16。
更大窗口的可能优势:我只需要计算 2*n 总和并立即可以使用这些总和来解决我正在寻找的模式。很大很大的缺点:我需要一个 (2*n) 维数组,其中会留下许多空条目。所以开销比较大。
你们有没有人这样做过?任何想法如何解决这个问题?我也没有考虑任何形式的对称性(旋转或直线)。
任何帮助是极大的赞赏!