用已知的三角形面构造凸形体对象。

问题描述 投票:0回答:1

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

上下文。 我需要构造一个三角形的棱镜(想象一个Toblerone酒吧--2个端面,6个侧面,都是三角形),以便进行一些内部点测试。由于我将会有许多这样的棱柱相邻而卧(在它们的侧脸上相邻,想象许多Toblerone酒吧站在它们的端部并且彼此相邻),我需要小心地确保空间中没有任何区域被两个相邻的棱柱所包含。棱柱的横截面一般不会是均匀的,因此相邻棱柱之间有可能出现重叠,如这张图所示,两个相邻棱柱之间的近似平面面。

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

请注意沿面构建的两条不同的对角线,这就是问题所在。一个棱镜可能会使用对角线将面分割成两个三角形,而相邻的棱镜可能会使用对角线。 为了确保相邻棱镜之间没有重叠,我需要明确控制三角形形成的顺序,使它们始终使用相同的对角线。这一点我可以做到:对于每一个我需要构造的棱柱,我都会提前知道三角形面的构造顺序。下面是两个相邻棱镜的例子,它们之间有正确的共享对角线。相邻的棱镜,共享对角线

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

如果我把船体构造成显式的 np.array 对象(顶点、面),然后我就可以用自己的代码来做测试(有许多可能的方法,我正在投影射线和测试与每个三角形面的交点)。问题是这样做的速度要比 find_simplex() 前面提到过的方法,我相信我可以更快的得到代码,但值得指出的是,这段代码已经在Cython的另一个用例中得到了相当的优化--我不知道我是否能找到所有额外的速度。虽然我相信我可以更快地得到代码,但值得指出的是,这段代码已经在另一个使用案例中进行了相当的优化--我不确定是否能在这里找到我需要的所有额外的速度。至于不可避免的 "你真的需要速度吗 "的问题,请相信我的话。这是把一个5分钟的工作变成了很多小时。

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

感谢任何能帮助我的人。

python convex-hull delaunay qhull scipy-spatial
1个回答
0
投票

半解... 不是对原问题的精确解决,而是用不同的方法实现同样的结果。任何一个三棱柱都可以被分割成正好三个四面体(见 http:/www.alecjacobson.comweblog?p=1888). 这是一个特殊的情况,任何多面体都可以通过将所有面连接到一个顶点来分割成四面体,如果面还没有包括它的话。

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

这有点长篇大论,涉及的测试数量是我想要的3倍,但这是个开始。如果将来有谁知道我如何能做得更好,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.