将体素/数据封装在框中的算法

时间:2014-06-26 20:51:49

标签: algorithm voxel

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

有人知道一个算法,找到立方体的最小可能区域(以及所有8个角位置),而立方体仍然封装了所有体素吗?

最好是一个不太重的算法。

2 个答案:

答案 0 :(得分:1)

如果你的意思是长方体 - 一个有6个矩形面的3D形状 - 如果这些面必须与体素数据的轴对齐,那么这只是(3D)边界框。您需要做的就是计算数据集中每个体素的x,y和z坐标的最小值和最大值。对这3个维度采用{minimum,maximum}的所有8种组合将给出8个角的坐标,尽管通常只记录两个点(min_x,min_y,min_z)和(max_x,max_y,max_z) ,完全描述了形状。

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

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

答案 1 :(得分:0)

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

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

一种可能的方法是:

  • 对于沿X轴的每条线,找到具有最小和最大X坐标的元素,并删除它们之间的所有元素
  • 对于沿Y轴的线和沿Z轴的线
  • 重复相同的操作

如果这听起来很奇怪,请考虑几何。如果您尝试在实体(或)外部绘制平面,则平面永远不会到达沿线的任何中间位置,因此在两个其他点之间的线段上的点不会有助于创建更紧密的拟合。 (这不是一个最佳算法,因为它不会给集合留下不必要的点,但它很容易和快速。)

如果要创建包含所有点的多面体,可以从一组平面创建它(在长方体的情况下为6)。在某种意义上,平面非常简单,对于任何最佳限制平面,以下都适用:

  • 所有点都与平面处于非负距离(即在同一侧)
  • 飞机上至少有一个点(零距离)

从点到平面的距离是一个非常简单的计算( ax + by + cx + d 每个点)。因此,在每个方向上找到限制平面是相对快速且容易的O(n)操作(其中 n 是剩余体素的数量)。

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

即使这些可能有用,但问题仍然存在:为什么?可能有更好的方法,而不是尝试制作一个小长方体。