0

给定一个 2D 整数数组,其中 0=白色,1=黑色,如下所示:

1110001
0110000
0011000
0101100
0100110
0100011
1000001
1011000
1011000

我想找到数组中的所有黑线。我不只是想要垂直水平和斜率为 1 的对角线。我可以做所有这些事情。我想要一种方法来查找所有斜率的线(它可以包括我已经这样做以减少代码的方式)。因此,如果您查看二维数组,您会看到一条斜率为 3 的线,从 [0,8](左下角)开始,一直到 [2,0](上中)。我查看了其他几个列表,但它们似乎只寻找我已经能够做的事情,或者没有给出找到这些行的方法。

我正在使用 Java 进行编码,但也欢迎使用 C++ 代码,或者只是一个合乎逻辑的解释。

如果我的描述仍然过于宽泛,请这样想:我希望能够找到可以使用绘图中的线条工具创建的每一行。

4

1 回答 1

0

相对而言,我想我找到了一个解决方案,它至少可以以合理的成本获得我正在寻找的大部分线路。请评论此解决方案中的任何缺陷。

  1. 查找所有水平、垂直和完全对角线(斜率为 1 或 -1)。将解释水平线以简化,但同样可以应用,对角线和垂直线使用小 tweeks。
  2. 检查最右边的点是否与右上角或顶部有相邻点。(对右下角或底部做同样的事情)。
  3. 如果相邻点向上,请检查从当前点向后移动的线列表中起点与相邻点相等的线。(在右下角或底部点的列表中执行相同的操作。)
  4. 当找到线或 Y 距离当前线 2 或更多时停止。
  5. 检查当前行的终点是否是新列表中行的终点(由多条水平线组成的列表)。如果是这样,请将新行(在步骤 4 中找到的行)添加到该行。(这将防止重叠的线条。
  6. 如果在第 4 步中 Y 距离为 2 或更多(行尾,无连接),则将行添加到主列表。
  7. 遍历完所有水平线后,将新列表添加到主列表。
  8. 重复 2-7 并在需要的地方进行调整,完成后,主列表应该是完整的。唯一的重叠应该是垂直线和水平线形成正方形,或类似的东西,但水平线或水平线附近不应发生重叠。

请让我知道此逻辑是否存在任何缺陷,如果可能,请提出替代方案。

于 2013-09-23T19:38:02.650 回答