给定一个点和大量的四面体,如何有效地确定该点在哪个四面体中

问题描述

假设我们定义一个点为元组 三个浮点数和一个四面体四个点的元组

假设我们有一个四面体和一个点,我们可以确定 点属于四面体,遵循 How to check whether the point is in the tetrahedron or not? 此处的关键思想是确定该点是否在四面体的四个侧面的内侧。

我的问题。给定一个点和N个四面体,其中N约为700万,我需要确定该点位于哪个四面体中。我们将关注以大量分数进行重复测试的性能

其他信息:

  1. 一个人可以使用上述方法逐个检查这些四面体。但是考虑到我的四面体数量很多,那可能太慢了。

  2. 问题设置中有一个特定要点。这些四面体是 从FEM(有限元法)问题中获得,用于求解 医学成像问题(它们形成患者的大脑)。也许FEM本身与问题无关,但是我们可以利用这样的事实,即这些四面体彼此相邻,并且在这些四面体所模拟的空间中没有“空洞”。

  3. 四面体在相邻边界上没有交点。因此,除非在边界处,否则这个问题应该有一个唯一的解决方案,在这种情况下,让任何一个相交的四面体都可以解决我的问题。

  4. 在输入上没有给出四面体的特定顺序。关于四面体的形状是否规则没有规定。

关于有效解决问题的任何想法?解决此问题的首选Python。

谢谢!

解决方法

您可以首先过滤四面体,仅保留边界长方体(与X,Y和Z轴平行)包含 p 的四面体。测试起来更快:

所以找到四面体-点 t 0 ,t 1 ,t 2 t 3 -关于点 p 具有以下属性:

  • i,j:t i x ≤p x ≤t j x
  • i,j:t i y ≤p y ≤t j y
  • i,j:t i z ≤p z ≤t j z

平均而言,这将只剩下几个四面体(通常只有一个或两个),然后您可以使用这些四面体进行点对四面体测试。

,

如果您打算针对同一组四面体测试很多点,那么我肯定会进行预处理步骤并为四面体构建空间结构。

在我的评论中,我提到了八叉树,但是知道四面体填充了空间(没有孔),我认为不需要对空间进行自适应细分,最好将其分成相等的部分。

  1. 将空格分成相等的框(将其命名为SpaceBoxes)。
  2. 在每个SpaceBox中,保留与框碰撞的四面体列表。
  • 为加快速度,我将测试四面体的边界框,而不是四面体本身。
  • 请注意,此步骤可以相对便宜地完成-您知道SpaceBox具有相同的大小,知道它们的位置,因此,给定四面体的边界框,就很容易找到SpaceBox候选对象。

现在,具有这种空间结构:

针对要测试的点p

  • 找到相应的SpaceBox O(1)
  • 您拥有所有与SpaceBox碰撞的四面体,因此这些都是要测试的候选对象
  • p与每个四面体的边界框的第一次测试碰撞
  • 只有那时,四面体本身

请注意,测试的性能主要取决于每个SpaceBox中四面体的数量。

假设空间是一个立方体:

  • 将每个边缘细分为16个部分,即可获得16 ^ 3 = 4096个SpaceBoxes
  • N = 7000000,大约应测试1709个候选四面体

此外,在实现方面,预处理和测试多点都看起来像数据并行问题,因此多处理可能会有所帮助。