【问题标题】:Point location in 3D convex polyhydron3D 凸多边形中的点位置
【发布时间】:2017-02-08 00:09:36
【问题描述】:

令 P 为具有 n 个顶点的 3D 凸多面体。
1. 给定一个以任意点 q 作为输入的算法,如何在 O(n) 时间内确定 q 是在凸多面体内部还是外部?
2.我可以做一些处理使其成为O(logn)吗?

【问题讨论】:

  • 我想大多数算法的时间都与面数有关,而不是顶点数。你有面孔吗?它们是如何定义的?

标签: computational-geometry


【解决方案1】:

对于 (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' 进行预处理。 (其他来源:12)这可以在 PSLG(平面直线图)检查中启用 O(log n) 点。

现在使用查询点 q 并将其投影到具有相同投影的同一平面上,可以在 O(log n) 时间内查找 L' 和 U' 的面。在 3D 中,每个面正好位于一个平面上。现在我们检查 q 在 3D 中的哪一侧,并知道 q 是否在多面体内部。

【讨论】:

  • 如何检查三角形q在哪一边?
  • 如编辑中所述:多面体的三角形或面恰好位于一个平面上。只需检查平面 q 位于哪一侧。正如计算带符号的点到平面的距离一样,符号已经为您提供了边。如果你想检查三角形。一些确定的人应该可以解决问题。
【解决方案2】:

(2) 的另一种方法是将多面体空间细分为 slubs - 以多面体质心为顶点并以多面体面为底面的金字塔。此类平板的数量为O(n)。您可以构建一个二元空间分区树 (BSP),由这些 slub(可能分为子 slub)组成 - 如果它是平衡的,那么点位置将在 O(logn) 时间工作。

当然,如果你需要多次调用点定位函数,这将是有道理的——因为这里的预处理步骤将花费O(n)时间(或更多)。

【讨论】:

  • 如果考虑质心的方向,它们由两个角度描述。你如何对两个参数进行排序?如何排列二叉搜索树?
  • @YvesDaoust - 我不想详细说明,因为这是众所周知的方法,请参阅 Wiki 文章,例如:en.wikipedia.org/wiki/Binary_space_partitioning。此外,OP 可以使用现有的库而不是发明自行车 - CGAL 和其他。这就是为什么我的回答如此简短
  • 二叉搜索树和二叉空间分区树是两个非常不同的东西。您的文字具有误导性。我不理解是对的。
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2013-07-11
  • 2013-05-26
  • 2017-09-29
  • 2011-05-09
  • 2015-08-17
相关资源
最近更新 更多