构造具有已知三角形面的凸包对象



TLDR:我需要构造一个python对象来进行快速内部点测试,类似于SciPyConvexHullDelaunayTriangulation。问题是,我提前知道了点的三角测量必须的构造顺序:(6个点,8个三角形面,每个面都有特定的顺序(。实际上,我已经知道凸包应该是什么了,但我需要它的形式可以与现有的(和优化的!(库一起使用(例如Scipy spatial(。我该怎么做?

上下文:我需要构造一个三角棱镜(想象一个Toblerone杆——2个端面,6个侧面,都是三角形(,以便进行一些内部点测试。由于我将有许多这样的棱镜彼此相邻(在它们的侧面上相邻,想象许多Toblerone棒在它们的末端并且彼此相邻(,我需要小心确保空间中的任何区域都不被两个相邻的棱镜包含。棱镜的横截面通常不均匀,因此相邻棱镜之间可能重叠,如两个相邻棱镜之间的近似平面图所示:

____
|  /|
| / |
| / | 
|/__|

注意沿着面构造的两条不同的对角线——这就是问题所在。一个棱镜可以使用\对角线将面拆分为两个三角形,相邻的棱镜可以使用/。为了确保相邻棱镜之间没有重叠,我需要明确控制三角形的形成顺序,使它们始终使用相同的对角线。我可以这样做:对于我需要构建的每个棱镜,我提前知道三角形面应该按照什么顺序构建。这是两个相邻棱镜的插图,它们之间有正确的共享对角线:相邻棱镜,共享对角线

我的问题是用这些棱镜进行快速内点测试。以前,我使用的是这个答案中链接的方法:Delaunay(prism_points).find_simplex(test_points) >= 0。它很快,因为它使用了高度优化的库代码,但我无法控制三角测量的构建,因此可能存在重叠。

如果我将外壳构建为显式np.array对象(顶点、面(,那么我可以使用自己的代码来进行测试(有很多可能的方法,我投影光线并测试与每个三角形面的相交(。问题是,这比前面提到的find_simplex()方法慢大约100倍。虽然我确信我可以更快地获得代码,但值得指出的是,这个代码已经从Cython的另一个用例中进行了相当优化——我不确定我是否能在这里找到我需要的所有额外速度。至于不可避免的"你真的需要速度问题吗",请相信我的话。这将把5分钟的工作变成很多小时。

我需要的是构建一个可以与外部优化库一起使用的对象,同时保留对三角形面的控制。在我的代码中添加额外的Cython当然是一种选择,但哪种高度优化的代码已经存在,使用它将是非常可取的。

感谢任何能提供帮助的人。

半个解决方案。。。这不是最初问题的确切解决方案,而是实现相同结果的不同方式。任何三棱柱都可以精确地分裂成三个四面体(参见http://www.alecjacobson.com/weblog/?p=1888)。这是一个特定的例子,任何多面体都可以通过将所有面连接到一个顶点而分裂成四面体,如果这些面还没有包括它的话

准确地知道我希望棱镜的面三角形如何排列,我就可以计算出哪三个四面体会再现相同的三角形配置(当然,在原始棱镜内部会添加额外的面(。然后,我依次围绕这三个四面体(即4个点的集合(中的每一个形成Delaunay三角,并进行原始的内部点测试:如果它在任何一个上匹配,那么我对整个棱镜都有一个阳性结果。关键是,通过一次只给Delaunay构造函数四个点,我确切地知道它将返回什么三角测量,因为只有一种方法可以形成这样的四面体(假设没有几何退化(。

这有点冗长,涉及的测试是我想要的3倍,但这只是一个开始。如果将来有人知道我该如何做得更好,请告诉我。

相关内容

  • 没有找到相关文章

最新更新