【问题标题】:Algorithm to fit fewest rectangles to irregular shape将最少的矩形拟合到不规则形状的算法
【发布时间】:2011-06-06 13:29:49
【问题描述】:

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

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

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

OOOXXXOOOO
OOXXXXXXXO
OOXXXXXXXO
OOXXXXOOOO

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

OOOAAAOOOO
OOBAAACCCO
OOBAAACCCO
OOBAAAOOOO

只有 3 个矩形或 26 个三角形。

这些网格的典型尺寸为 128x128x128,因此很明显,如果我能在合理的时间内有效地将形状减少到尽可能少的矩形,我会从巨大的性能提升中受益,但我对以下方面的想法感到困惑算法。

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

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

【问题讨论】:

  • 你的网格中有一个“形状”吗?
  • 可能会生成孤立的 X 岛“岛”(我正在使用 Ken Perlin 的单纯形噪声生成这些地图)
  • 如果你在渲染,你不应该选择最少的顶点而不是最少的矩形吗?您可能会丢弃体积内的所有顶点...(除非您有透明度)
  • 好点,我不知道为什么我打算再这样画了。

标签: algorithm image math graphics 3d


【解决方案1】:

也许是“八叉树”之类的东西:

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

对于 64x64x64 网格中的每个单元格,按以下方式进行:

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

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

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

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

【讨论】:

  • 是的,我不是每帧都计算几何图形,但每次变化时我都必须重新计算它,因为它是一个动态系统
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多