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

Algorithm 如何测试给定的BSP树是否是最优的?,algorithm,3d,bsp-tree,Algorithm,3d,Bsp Tree,我有一个三角形的多边形汤,我想为它构建一个BSP树。我当前的程序只是通过从模型中一次插入一个随机三角形来构造一个BSP树,直到所有三角形都被消耗,然后它检查树的深度和宽度,并记住它获得的最佳分数(最低深度,最低宽度) 根据定义,最佳深度应为log2(n)(如果共面三角形分组,则深度应小于log2?),其中n是我的模型中三角形的数量,而最佳宽度应为n(表示未发生分裂)。但是,有一些三角形的构型永远达不到这个顶点 是否有一个有效的测试来检查我的BSP树的质量?具体地说,我正在试图找到一种方法,让我的

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

根据定义,最佳深度应为log2(n)(如果共面三角形分组,则深度应小于log2?),其中n是我的模型中三角形的数量,而最佳宽度应为n(表示未发生分裂)。但是,有一些三角形的构型永远达不到这个顶点


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

随机构建BSP树,直到你偶然发现一个好的BSP树,这将是非常非常非常低效的

与其随机选择一个tri用作拆分平面,不如尝试几个(可能全部,或者随机采样),然后根据某种启发式选择一个。启发式通常基于(a)结果子节点的平衡程度,以及(b)它将拆分多少个tri

通过将较小或较大的TRI采样作为候选拆分平面,可以权衡性能和质量


但最终,对于任何现实世界的数据,你都不可能得到一棵完全最优的树,因此你可能不得不满足于“足够好”。最优树的构造是一个NP完全问题。确定给定的树是否最优本质上是同一个问题

由此:

问题是分裂对分裂 树木平衡。这些是相互关联的 独家要求。你应该 选择你的策略来建立一个 好树基于你打算怎么做 使用这棵树

  • 尝试选择(可能)被大多数平面分割的平面作为分割平面。拆分平面不能被拆分
  • 尝试拾取前面和后面的平面数接近的平面
  • 试着选择一个不会造成太多分裂的平面
  • 尝试拾取与许多其他曲面共面的平面

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

构建最佳BSP树是NP完全的。但是你可以通过启发式和局部搜索来构建一个非常好的分区平面。一般来说,测试一个解决方案是否是最优的和找到一个最优的解决方案不必属于同一个复杂度类别。你可能知道一些参考资料,检查一棵BSP树是否是最优的是NP完全的吗?实际上,在点集的情况下,即使是一棵随机BSP树也具有渐近最优的复杂性。