假设我们有一个具有N个顶点的3D多面体。 如何测试点是否在时间O(n)内。 应该是线性算法,但我的搜索不成功。
答案 0 :(得分:1)
如果您有N个点定义凸多面体(多边形的3D版本),这意味着生成的形状在拓扑上等效于球体。
如果你查看一些拓扑定理,这并不难证明。基本上,没有孔会使您的多面体与球体处于几何对象的“属”中,因为它们都没有内部孔。然后,您只需移动每个顶点 - 一组N个延伸 - 从给定的内部点位置固定距离R.由于所有这些点现在都位于球体表面上,并且您只使用拓扑上合法的“拉伸”操作(通过移动顶点来拉伸边界面),因此凸多面体在拓扑上等效于球体。我省略了正式术语,因为它们不会增加太多混乱。
只要添加任何排除的内部区域 - 孔,您就不再等同于球体了。在这种情况下,您可以使用相同的扩展版本。你测试你是否在多面体的“边界面”内,然后测试你是否在它的任何一个洞内(它们也是多面体)。你需要一些额外的标志或术语来处理作为外多面体等一部分的孔内的孔。
答案 1 :(得分:0)
解决方案是: 由于多面体在拓扑上等效于球体,因此它的面(和边)计数为O(n)(因为它相当于平面图,...... - 需要一个简短的证明)。并简单地迭代所有面并进行类似于2D中的点多边形测试的光线投射实际上将在O(n)中运行,因为只有O(n)个面。