我有一个渲染应用程序,可以在三维网格中渲染大量的立方体。这本质上是低效的,因为每个立方体代表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数字引用),因此如果可能的话,可以使用多个类别的版本将非常有用。
答案 0 :(得分:0)
也许像“八叉树”这样的东西:
在128x128x128网格上构建一个64x64x64网格,以便第一个网格的每个单元格“包含”第二个网格的高度单元格。
对于64x64x64网格中的每个单元格,请按以下步骤操作:
现在在64x64x64网格上构建一个32x32x32网格并重复。
然后是16x16x16,8x8x8,4x4x4,2x2x2,1x1x1,你就完成了:)
当然,最好是一次性计算八叉树,而不是每次渲染操作。