识别2D网格中的自定义形状

时间:2013-09-05 11:09:55

标签: algorithm computational-geometry

亲爱的stackoverflowers。

所以,假设有一个网格,它在某个x和y处的值表示是否存在一个区块(1)或它是否缺失(0)。

例如,

100110100010
100100111110
111110000000
000010000000

还有一些已知的形状A,B和C,例如,

(A)  (B)  (C)
  1  1     1
111, 111, 11 

所以我想要实现的是识别网格上哪个1属于哪个形状。 所有的1都应该用完,确切的形状数量是已知的,但是允许旋转(没有镜像),所以我想最好添加旋转版本并认为在网格上找不到某些形状。

所以,预期的结果是(已知它应该是1xA,2xB,2xC):

A00CC0B000C0
A00C00BBBCC0
AABBB0000000
0000B0000000

如果有几种可能的匹配,只要每个瓷砖都分配给它自己的形状,任何都适合。

此外,找出一块瓷砖是否存在(“揭开”)是一项昂贵的操作(但结果是缓存的,瓷砖不会出现在任何地方),所以我实际上正在寻找一种方法来识别它们以尽可能少的“揭露”数量。 (没关系,如果它不是最佳的,只要识别形状就会很棒)。

显然,已知形状的集合可能会发生变化(但是它会在实现时知道并且它将保持不变,因此可以调整特定瓷砖集的代码或开发一些搜索策略),但它不会很大(~5-6),网格也很小(~15x15)。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用提示here和/或here(我想使用此提示,对象类型为01),其中一种方法可能尝试将自己的模式与收集的对象目录进行匹配。举个例子,

100110100010
100100111110
111110000000
000010000000

Shapes A, B and C:

(A)           (B)             (C)
  1      1     1       111     1      11
111  or  1     111  or   1     11  or  1 
         11

第一个收集的对象可能是,

1  11
1  1
11111
    1    

=> represented as a set of numbers: [(0,0),(0,1),(0,2),(1,2)..etc]
   (the objects need not start or include (0,0) but object 
    bounds seem needed to calibrate the pattern matching)

对象左上角的测试对象A将匹配[(0,0),(0,1),(0,2),(1,2)]。在匹配A之后,程序必须找到校准剩余点的方法 - 右下角将被有效地测量为(2,3)而不是(4,3) - 测试剩余点的右下角对象中的点将匹配对象B。继续以类似的方式匹配所有,如果未找到总匹配,尝试不同的组合。