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

标签 algorithm image math graphics 3d

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

为了填充区域,我使用了一个 3 维数组,其中 0 值表示空白区域,非 0 值表示 block 。

例如(其中 X 表示放置立方体的位置)

OOOXXXOOOO
OOXXXXXXXO
OOXXXXXXXO
OOXXXXOOOO

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

OOOAAAOOOO
OOBAAACCCO
OOBAAACCCO
OOBAAAOOOO

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

这些网格的典型大小是 128x128x128,所以很明显,如果我能在合理的时间内有效地将形状减少到尽可能少的矩形,我将受益于巨大的性能提升,但我一直没有想法一种算法。

使用 Dynamic programming - Largest square block将是一种选择,但它不会产生最佳答案,但如果解决方案太复杂而无法有效执行,那么这将是必经之路。

最终我将拥有多种类型的立方体(例如,绿色、棕色、蓝色,在数组中使用不同的非 0 数字进行引用),因此如果可能的话,一个适用于多个类别的版本将非常有帮助。

最佳答案

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

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

对于 64x64x64 网格的每个单元格,像这样进行:

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

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

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

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

关于将最少的矩形拟合为不规则形状的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4647565/

相关文章:

javascript - 如何在react-native中使用ImageBackground播放gif?

Python 三角函数返回复数?

algorithm - 是否有一种算法可以在线性时间内找到 log(n) 顺序统计信息

mysql - 通过删除重复项添加唯一约束

c++ - 绘制固定背景

algorithm - 一般情况下的费用是多少?

java - 关于使用 Java Swing 循环动态加载图像的问题

javascript - 用图像替换文本 Google 脚本?

algorithm - 使用输入字符模式(或频率)确定霍夫曼树的深度?

在列表中查找匹配对的算法