在Gridmap上识别特定NxN模式的快速方法

时间:2012-09-12 18:30:11

标签: design-patterns map grid identification

我确实有以下问题要解决:我有一个简单但很大的网格图(大小:mX-times-mY)。我只区分被障碍占用的瓷砖或是自由的。

现在假设我使用大小为n-times-n的相对较小的滑动窗口,因此n<< mX,n<我的。对于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:使用行和和列和作为标识符

我将所有n行和所有n列相加,并将这些和作为多维数组中的子指数使用。 对于上面的例子:sumRow1 = 1 sumRow2 = 1 sumCol1 = 1 sumCol2 = 1 所以我的模式保存在patternNumbers [1] [1] [1] [1] = 10中。另一个例子是模式16,它将保存在patternNumbers [2] [2] [2] [2] = 16。

更大窗户的可能优势:我只需要计算2 * n总和,并立即使用这些总和来解决我正在寻找的模式。 大的,大的缺点:我需要一个(2 * n)维数组,其中将留下许多空的托盘。所以开销相对较大。

你们之前有没有人这样做过?任何想法如何解决这个问题?我也没有考虑任何形式的对称性(旋转或线)。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

好吧,看起来我找到了一个相对简单的解决方案,其他人向我指出:

通过按特定顺序获取所有行或所有列(无关紧要,您的选择!) - 对于所有模式必须相同 - 并将它们对齐为一个长向量,然后获得常规二进制表达式。只需将该二进制数转换为十进制数,即可拥有“唯一标识符”。

Example 1:

00
#0

can also be written as
00
10

now reorder the rows to

0010 = 2

=============================

Example 2:

##
00

can also be written as
11
00

now reorder the rows to

1100 = 12