Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在长方体中封装体素/数据的算法_Algorithm_Voxel - Fatal编程技术网

Algorithm 在长方体中封装体素/数据的算法

Algorithm 在长方体中封装体素/数据的算法,algorithm,voxel,Algorithm,Voxel,我有一个有8个可变角的立方体。我还有一个体素数据集,它的所有尺寸都是相同的 有没有人知道一种算法,在立方体仍然封装所有体素的情况下,找到立方体的最小可能区域(以及所有8个角点位置) 最好是不太重的算法。如果你指的是长方体——一个有6个矩形面的3D形状——如果这些面必须与体素数据的轴对齐,那么这只是(3D)边界框。您只需计算数据集中每个体素的x、y和z坐标的最小值和最大值。对于这3个维度,取所有8个组合的{最小值,最大值}将为您提供8个角的坐标,尽管您通常只记录两个点(最小值x,最小值y,最小值z

我有一个有8个可变角的立方体。我还有一个体素数据集,它的所有尺寸都是相同的

有没有人知道一种算法,在立方体仍然封装所有体素的情况下,找到立方体的最小可能区域(以及所有8个角点位置)

最好是不太重的算法。

如果你指的是长方体——一个有6个矩形面的3D形状——如果这些面必须与体素数据的轴对齐,那么这只是(3D)边界框。您只需计算数据集中每个体素的x、y和z坐标的最小值和最大值。对于这3个维度,取所有8个组合的{最小值,最大值}将为您提供8个角的坐标,尽管您通常只记录两个点(最小值x,最小值y,最小值z)和(最大值x,最大值y,最大值z),这两个点完全描述了形状

如果形状必须是立方体(即所有尺寸相等),则必须将两个较小尺寸的大小增加到最大尺寸的大小


如果您正在寻找可用于高效相交测试(使用点、线、平面或其他边界体积)的绑定体积的形状,则另一个不错的选择是球体。两个球体之间的相交测试特别简单:你所需要做的就是检查它们中心之间的距离是否超过它们半径的总和。

j_random_hacker已经给出了一个很好的答案,长方体与轴对齐,立方体与轴对齐,球体对齐。然而,如果你真的想找到最佳长方体,算法就会变得复杂得多

我假设网格中有一组体素。如果体素表示实体或形成密集云,则可能需要创建一组表示形状外壳的体素。创建凸面外壳(无论是球体还是任何凸面多面体)时,内部体素并不重要

一种可能的方法是:

  • 对于沿X轴的每条线,找到具有最小和最大X坐标的元素,并删除它们之间的所有元素
  • 对沿Y轴的线和沿Z轴的线重复相同的操作
如果这听起来很奇怪,想想几何。如果尝试在实体(或)外部绘制平面,则该平面永远无法到达直线上的任何中间位置,因此位于两个其他点之间的线段上的任何点都无法帮助创建更紧密的拟合。(这不是一个最优算法,因为它不会给集合留下不必要的点,但它简单快速。)

如果要创建包含所有点的多面体,可以从一组平面(长方体为6)创建它。平面非常简单,因为对于任何最佳极限平面,以下情况都成立:

  • 所有点与平面的距离均为非负(即在同一侧)
  • 平面上至少有一个点(零距离)
从一个点到一个平面的距离是一个非常简单的计算(每个点的ax+by+cx+d)。因此,在每个方向上查找限制平面是一个相对快速且简单的O(n)操作(其中n是剩余体素的数量)

更糟糕的是,为飞机选择正确的方向并不容易。我不知道是否有一个最佳的算法,但我只能想到笨拙或缓慢的算法,要么是大量的蛮力计算(多个方向的平面距离),要么是迭代猜测


即使这些方法可能有用,但真正的问题是:为什么?可能有比尝试制作小长方体更好的方法。

只是为了验证:你真的在谈论一个立方体,即一个有六个正方形面的规则实体吗?在这种情况下,我们有简单的缩放(立方体大小)、平移(立方体位置)和旋转,即六个自由度。另外,是否希望立方体的面积(表面积)或体积尽可能小?(对于立方体来说,这并不重要,但如果你接受其他形状,那么这可能很重要。)我认为不是真正的立方体,更像是具有8个可变角的几何体。一个立方体形状可能也会起作用,而且可能会快得多。不过,对于这个问题,我并不打算采用立方解。我的目标是在封装所有体素的同时获得尽可能小的体积。