将最小矩形拟合为不规则形状的算法

时间:2011-01-10 14:00:39

标签: algorithm image math graphics 3d

我有一个渲染应用程序,可以在三维网格中渲染大量的立方体。这本质上是低效的,因为每个立方体代表4个顶点,并且通常立方体是相邻的,创建一个可以由单个矩形表示的表面。

要填充区域,我使用的是三维数组,其中值0表示空格,非0值表示块。

e.g。 (其中X表示放置立方体的位置)

OOOXXXOOOO
OOXXXXXXXO
OOXXXXXXXO
OOXXXXOOOO

目前将被表示为21个立方体或252个三角形,而它可以很容易地表示为(其中每个字母表示矩形的一部分)

OOOAAAOOOO
OOBAAACCCO
OOBAAACCCO
OOBAAAOOOO

这只是3个矩形,或26个三角形。

这些网格的典型尺寸是128x128x128,所以很明显,如果我可以在合理的时间内有效地将形状缩小到最小的矩形,我将从大量的性能提升中受益,但我坚持想法算法。

使用Dynamic programming - Largest square block将是一个选项,但它不会产生最佳答案,尽管如果解决方案太复杂而无法有效执行,那么这将是必须的。

最终我会有多种类型的多维数据集(例如绿色,棕色,蓝色,在数组中使用不同的非0数字引用),因此如果可能的话,可以使用多个类别的版本将非常有用。

1 个答案:

答案 0 :(得分:0)

也许像“八叉树”这样的东西:

在128x128x128网格上构建一个64x64x64网格,以便第一个网格的每个单元格“包含”第二个网格的高度单元格。

对于64x64x64网格中的每个单元格,请按以下步骤操作:

  • 如果包含单元格的高度具有相同的值,请将该值放在64x64x64网格中。
  • 否则单独绘制每个单元格并在64x64x64网格中放置-1。

现在在64x64x64网格上构建一个32x32x32网格并重复。

然后是16x16x16,8x8x8,4x4x4,2x2x2,1x1x1,你就完成了:)

当然,最好是一次性计算八叉树,而不是每次渲染操作。