【发布时间】:2017-12-27 19:21:23
【问题描述】:
我有一个由网格(点和连接)定义的 3d 区域。我有一个 point(x,y,z) 。需要检查该点是在 3d 区域的内部/外部还是表面上。正在寻找优化的解决方案,因为我需要检查 C++ 中的数百万个点。
我尝试使用立体角方法,但速度很慢。 请为此建议任何算法或方法。
【问题讨论】:
-
征求建议和现成的解决方案对于 SO 来说是题外话
我有一个由网格(点和连接)定义的 3d 区域。我有一个 point(x,y,z) 。需要检查该点是在 3d 区域的内部/外部还是表面上。正在寻找优化的解决方案,因为我需要检查 C++ 中的数百万个点。
我尝试使用立体角方法,但速度很慢。 请为此建议任何算法或方法。
【问题讨论】:
假设您的网格是四面体网格,您可以这样做:
找到可能承受该点的四面体子集。也就是说,尽可能多地排除候选人。您可以通过使用八叉树或 kd-trees 等结构来做到这一点。
对于剩下的所有四面体,计算该点相对于给定四面体的重心坐标。如果任何坐标为负,则位于外部。
可以通过计算子四面体相对于该点的体积,然后将该体积除以总体积来计算重心坐标。您可以通过快速搜索找到公式。
编辑:Barycentric coordinates of a tetrahedron 就是一个例子。
(也就是说,总是有很多优化空间 - 最好是找到一个可以为您执行此操作的好的库。例如,如果您想并行计算,则需要进行一些实验找出用于当前处理器和给定网格的理想内核数量。通常不是最大值。)
如果您的网格由八面体(“不均匀立方体”)组成,您需要求解线性方程组。多面体越复杂,您的公式就越复杂。对于一般的凸多面体,最好的方法可能是为每个面计算一个半空间,以便多面体是这些半空间的交集,然后查看这些点是否位于所有这些空间中。
【讨论】: