【发布时间】:2017-02-08 00:09:36
【问题描述】:
令 P 为具有 n 个顶点的 3D 凸多面体。
1. 给定一个以任意点 q 作为输入的算法,如何在 O(n) 时间内确定 q 是在凸多面体内部还是外部?
2.我可以做一些处理使其成为O(logn)吗?
【问题讨论】:
-
我想大多数算法的时间都与面数有关,而不是顶点数。你有面孔吗?它们是如何定义的?
令 P 为具有 n 个顶点的 3D 凸多面体。
1. 给定一个以任意点 q 作为输入的算法,如何在 O(n) 时间内确定 q 是在凸多面体内部还是外部?
2.我可以做一些处理使其成为O(logn)吗?
【问题讨论】:
对于 (1),如果你有一个具有 n 个顶点的凸多面体,那么你也有 O(n) 个面。一个人可以对每个面进行三角测量,总的来说它仍然是 O(n) 个三角形。现在取查询点 q 并检查三角形 q 位于哪一侧。此检查对一个三角形采用 O(1),因此对所有三角形采用 O(n)。 编辑: O(n) 面定义 O(n) 平面。只需检查所有平面的 q 是否位于同一侧。
对于(2),(我没有找到来源,但似乎合理)可以将多面体 P 作为 P' 投影到平面上。 P' 可以看作是两个独立的平面图,一个图 U' 表示多面体的上部,第二个图 L' 表示下部。 L' 和 U' 总共有 O(n) 个面。现在可以通过Kirkpatrick optimal planar subdivision 算法对 L' 和 U' 进行预处理。 (其他来源:1 和 2)这可以在 PSLG(平面直线图)检查中启用 O(log n) 点。
现在使用查询点 q 并将其投影到具有相同投影的同一平面上,可以在 O(log n) 时间内查找 L' 和 U' 的面。在 3D 中,每个面正好位于一个平面上。现在我们检查 q 在 3D 中的哪一侧,并知道 q 是否在多面体内部。
【讨论】:
(2) 的另一种方法是将多面体空间细分为 slubs - 以多面体质心为顶点并以多面体面为底面的金字塔。此类平板的数量为O(n)。您可以构建一个二元空间分区树 (BSP),由这些 slub(可能分为子 slub)组成 - 如果它是平衡的,那么点位置将在 O(logn) 时间工作。
当然,如果你需要多次调用点定位函数,这将是有道理的——因为这里的预处理步骤将花费O(n)时间(或更多)。
【讨论】: