1

亲爱的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)。

谢谢!

4

1 回答 1

0

使用这里和/或这里的想法(我想使用这个,对象类型将是0and 1),一种方法可能是尝试将您自己的模式与收集的对象目录进行匹配。举你自己的例子,

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。继续以类似的方式匹配所有,如果未找到完全匹配,则尝试不同的组合。

于 2013-09-05T19:00:21.987 回答