在N维网格中查找缺失点 避免“ Troolean”逻辑

问题描述

我有一个包含数据的N维(常规)网格,它不能完全填满它的体积,而应该是凸的。因此,例如,在2D模式中,这是可以的(1 =存在,0 =丢失):

0011111100
0111111110
1111111111
0011111100
0000011100

但这不是:

0011111100
0111101110
1111111111
0011111000
0000011100

我想在第二个示例中找到其他零(以粗体显示)。我想在2个以上的维度上做到这一点。

我现在唯一想到的方法是在N-1维中获取所有可能的坐标,并检查第N维是否为凸面,这仅意味着找到该维中的第一个和最后一个数据点并检查是否之间缺少任何一点。但是我必须在每个维度以及该维度的每个切片中都这样做。

必须有一个更简单的解决方案,对吧?

解决方法

您需要弄清楚并理解有助于为给定多维网格获得“ 多维凸包”的算法。这有点复杂,我无法在文章中解释完整的解决方案,但可以提供以下指示。

我怀疑在谈论多维时是否会存在一个更简单的解决方案。

,

要轻松解决此问题,请考虑一个相反的问题:“如何找到形状周围的空间?”

如果您知道如何填充形状周围的所有空间,则不属于该空白空间的所有像素或体素都必须是凸包的一部分。在以下示例中,我们:

  1. 0填充周围-的所有空间
  2. -替换为0,并将0替换为1(导致凸包)
  3. 与原始模型进行异或
01110        -111-        01110        00000
11010   ->   1101-   ->   11110   ->   00100
11111        11111        11111        00000

在最终结果中,1现在表示封闭的空白空间。请注意,-可以表示为23来起作用,我们暂时需要每个体素使用两位,而不仅仅是一个。

要实施第一步,我们只需为模型边缘上的所有体素用0填充所有-体素即可。对于这些边界体素中的每一个,我们都开始单独的泛洪运行。模型内部的空白空间保持不变,因为洪水填充无法达到。

实施第二步和第三步应该很简单。

避免“ Troolean”逻辑

也可以仅使用布尔逻辑来完成所有这些操作,因此不需要第三个-值。为此,我们将必须:

  • 使用1而不是-填充输入数组中的零
  • 对于我们填充的每个体素,将1写入单独的输出缓冲区

然后第一步将得出以下结果:

10001
00001
00000

我们现在只需要对该缓冲区进行位翻转就可以得到凸包。