假设我们有一个具有N个顶点的3D多面体。 你如何测试一个点是否在时间O(n)内。 应该有一个线性算法,但我的搜索不成功。线性时间的多面体测试点
回答
如果有限定凸多面体(3D版多边形的)N个点,这意味着得到的形状是拓扑等价球体。
如果你查找几个拓扑定理,这并不难证明。基本上,由于没有内部孔,所以缺少孔将您的多面体放置在与球体相同的几何对象的“属”中。然后,您只需将每个顶点(一组N个拉伸)转换为距给定内点的某个固定距离R.由于所有这些点现在位于球体的表面上,并且只使用拓扑合法的“拉伸”操作(通过移动它们的顶点来拉伸边界面),所以凸多面体在拓扑上等同于球体。我省略了正式的条款,因为它们不会增加太多混乱。
只要你空穴 - 并不等同于球体再添加任何排除内部区域 - 。在这种情况下,你可以使用相同的扩展版本。你测试你是否在多面体的“边界面”内,然后测试你是否在它的任何一个洞内(它们也是多面体)。你需要一些额外的标志或条款孔位于外多面体的一部分,等
可能您正在使用给定顶点的凸包。
计算凸包(O(N log n)的),并发现是在多面体点(O(N))具有复杂度O(N log n)的。
如果点不在凸多面体比有分隔点和多面体的平面。在2D中,很容易找到从点到多面体顶点的矢量之间的分离平面测试角度。对于3D我不知道如何做到这一点(在O(n))。
解决方案是: 由于多面体在拓扑上等价于一个球体,因此它的面(和边)数为O(n)(因为它相当于一个平面图,... - 需要一个简短的证明)。只需迭代所有面并进行类似于2D中的点中多边形测试的光线投射,实际上将在O(n)中运行,因为只有O(n)个面。
等等,什么?一个低调的,但接受的答案? –
- 1. 线程测试的时间
- 2. 测试多时间
- 3. 多线程性能和性能测试
- 4. 测试三维点是否在三维多面体内
- 5. 用多媒体中间件测试django页面
- 6. 测量多线程的执行时间
- 7. 性能测试 - 测试:配置文件与测试:基准测试,壁挂时间与处理时间对比
- 8. 使用点测试找到两个四面体的交点
- 9. 单元测试,黑盒测试时需要多长时间?
- 10. 当存在因素时测试多重共线性
- 11. 球体表面上的测地线(最短距离路径)之间的交点
- 12. 多线程完成时间测量
- 13. 多核处理时间线性增加
- 14. 多线程单元测试
- 15. 多线程锁测试
- 16. 多线程单元测试
- 17. 多线程单元测试
- 18. Inspec测试多个实体
- 19. Exlude时间测试
- 20. robotium测试每次点击之间的等待时间
- 21. ImageJ线性测量。如何避免点击时线条消失?
- 22. 时间戳测试单元测试
- 23. LP的线性独立测试
- 24. 解释别名表R测试模型的多重共线性
- 25. 测试/改善多线程程序的性能
- 26. 测试原理图中两点之间的连通性
- 27. Java中的多线程基准测试
- 28. Spock的多线程代码测试
- 29. C#多线程的速度测试
- 30. 多线程测试中的空引用
不幸的是为凸多面体不需要内处理孔。无论如何,似乎算法在O(n)中运行的额外要求是多面体是简单的(在拓扑上相当于一个球体)。这应该意味着它可以变成一个球形的物体,它是凸的,就是它。我只需要考虑这样一个转换... – anonymous
那么,你有面孔定义的多面体? – Ante
我想我现在有解决方案。由于多面体在拓扑上等价于球体,因此它的面(和边)数为O(n)(因为它相当于一个平面图,... - 需要一个简短的证明)。只需迭代所有面并进行类似于2D中的点中多边形测试的光线投射,实际上将在O(n)中运行,因为只有O(n)个面。 – anonymous