-1

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

4

1 回答 1

0

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 次测试。

于 2012-12-02T01:34:36.940 回答