如何测试给定的BSP树是否最佳?

时间:2008-10-02 16:09:52

标签: algorithm 3d bsp-tree

我有一个三角形的多边形汤,我想为它构建一个BSP树。我当前的程序只是通过一次从模型中插入一个随机三角形直到所有三角形都被消耗来构建一个BSP树,然后它检查树的深度和宽度并记住它达到的最佳分数(最低深度,最低宽度) )。

根据定义,最佳深度为log2(n)(如果共面三角形分组,则为更小?),其中n是模型中三角形的数量,最佳宽度为n(意味着没有分裂发生了)。但是,有一些三角形的配置,永远不会达到这个顶峰。

是否有检查BSP树质量的有效测试?具体来说,我正试图找到一种方法让我的程序知道它应该停止寻找更优化的结构。

3 个答案:

答案 0 :(得分:3)

构建最优树是NP完全问题。确定给定的树是否是最优的基本上是同样的问题。

从此BSP faq

  

问题是分裂对抗   树平衡。这些是相互的   独家要求。你应该   选择你的战略来建立一个   好树根据你的意图   使用树。

答案 1 :(得分:2)

随机构建BSP树,直到你有机会获得一个好的,这将真的非常低效。

不是随机选择tri作为分割平面,而是想尝试几个(可能全部,或者可能是随机抽样)并根据某种启发式选择一个。启发式通常基于(a)生成的子节点的平衡程度,以及(b)它将分裂多少tris。

您可以通过考虑将较小或较大的tris采样作为候选分裂平面来权衡性能和质量。

但最终,您无法希望为任何真实数据获得完全最优的树,因此您可能不得不满足于“足够好”。

答案 2 :(得分:1)

  • 尝试选择(可能)被大多数平面拆分为分裂平面的平面。拆分飞机不能拆分。
  • 尝试选择一个与前面几乎相同数量的飞机的飞机。
  • 尝试选择一个不会造成太多分裂的飞机。
  • 尝试选择与许多其他表面共面的平面

您必须对此标准进行抽样,并提出一个评分系统,以确定哪一个最有可能成为分裂平面的最佳选择。例如,进一步失去平衡,失去的分数越多。如果它导致20次分裂,则罚分为-5 * 20(例如)。选择得分最高的那个。您不必对每个多边形进行采样,只需搜索一个非常好的多边形。