【问题标题】:Find missing points in N dimensional grid在 N 维网格中查找缺失点
【发布时间】:2020-09-01 15:04:51
【问题描述】:

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

0011111100 0111111110 1111111111 0011111100 0000011100

但这不是:

0011111100 0111101110 1111111111 0011111000 0000011100

我想在第二个示例中找到额外的零(以粗体标记)。而且我想在超过 2 个维度上做到这一点。

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

一定有更简单的解决方案吧?

【问题讨论】:

    标签: algorithm grid point convex


    【解决方案1】:

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

    我怀疑是否存在更简单的解决方案,因为您正在谈论多个维度。

    【讨论】:

    • 谢谢,将查看您提供的链接。
    • 这不是一个网格处理问题,这是一个只涉及体素的问题。对于这样的事情,凸壳算法绝对是矫枉过正。这里可以使用一个简单的基于洪水填充的方法。
    • 在 OP 给出的示例中尝试使用 simple flood-fill-based approach
    【解决方案2】:

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

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

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

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

    为了实现第一步,我们简单地用-对模型边缘的所有体素填充所有0体素。对于每个边界体素,我们开始单独的洪水填充运行。模型内部的空白空间保持不变,因为洪水填充没有到达它。

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

    避免“特鲁尔”逻辑

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

    • 1代替-在输入数组中填充零
    • 对于我们填充的每个体素,将1 写入单独的输出缓冲区

    第一步会给我们一个结果:

    10001
    00001
    00000
    

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

    【讨论】:

    • 我第一次看到这个帖子的时候也是这么想的。您可以尝试在 OP 发布的示例中使用此技术吗?它适用于被所有 1 包围的 0,但不适用于凸包内的 0,但不能被所有边的 1 包围。
    • 我就是这么想的。我看不出这对填充区域边缘的缺失点有何作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多