【问题标题】:Minimum bounding rectangle, when 3D shape is not known...only that it fits a 3D matrix?最小边界矩形,当 3D 形状未知时......仅它适合 3D 矩阵?
【发布时间】:2012-11-19 20:58:07
【问题描述】:

我已经搜索过这个算法,包括在 stackoverflow 上,但没有找到。与为已知 3D 图找到最小边界矩形不同,我试图为任意、实心、连续的 3D 图找到一个轴对齐的...唯一的限制是该图完全适合 3D 矩阵给定大小,例如 800X800X800。有人可以给我一个有效的算法吗?

【问题讨论】:

    标签: minimum bounding


    【解决方案1】:

    如何将 3D 图形表示为一组边界多边形或其他?

    我假设您可以在 3D 图形上获得一组顶点,无论它们是否在其外表面上。

    我假设“最小边界矩形”是指具有最小体积的边界直线实体(如砖块)。

    “轴对齐”我假设您的意思是砖块的边缘与预先存在的 x、y 和 z 轴对齐。 即你不能通过旋转来使砖变小。

    然后根据您的描述,听起来您只需要沿每个坐标轴的最小值和最大值。 这将花费点数的线性时间。

    除非我误解了这个问题。

    编辑:好的,根据您的说明,您从 800^3 数组 a 的布尔值开始,我能想到的最好的是:

    // a lot depends on how you index array a
    // this assumes it is one big block of bools
    #define A(i,j,k) a[(i)*800*800 + (j)*800 + (k)]
    // to get the minimum X value
    for (ix = 0; ix < 800; ix++){
        // search over the entire plane at x == ix
        // this can probably be improved by stepping pointers
        for (iy = 0; iy < 800; iy++){
            for (iz = 0; iz < 800; iz++){
                // nobody likes goto, but it's probably the quickest way out
                // of the 3 nested loops
                if (A(ix, iy, iz)) goto L100;
            }
        }
    }
    L100:;
    // here, ix is minimum x value
    
    // do similar code for max x, min and max y, min and max z
    

    它可能会有所改进。 最坏的情况,如果卷为空,这将进行 3^800^3 次测试。 最好的情况,如果卷已满,它将进行 6*800^2 次测试。

    【讨论】:

    • 我唯一的输入是一个 3D 布尔矩阵......前面提到的立方体,比如 800x800x800。我必须为其计算轴对齐的最小边界矩形的 3D 图形的大小未指定(完全包含在输入矩阵中),并且位于输入矩阵中未指定的位置。它是实心和连续的,并由相应输入矩阵元素的 TRUE 值表示。其余输入矩阵元素为 FALSE。
    • 是的,我的意思是边界直线实体...一个盒子或砖块。
    • 是的,边缘与预先存在的 x、y 和 axws 对齐...与输入立方体相同。
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2021-04-12
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多