找到四面体网格边缘的算法

时间:2016-04-21 01:26:59

标签: algorithm math 3d computational-geometry mesh

我有几千个用于建模的四面体网格。我有顶点和曲面信息,它们被索引到两个矩阵中,其中一些是相关的。曲面的节点链接到顶点的矩阵。我想找到哪些顶点相互连接形成四面体。是否有算法来检测形成四面体边缘的顶点的连通性?

3 个答案:

答案 0 :(得分:0)

如果您的节点矩阵是邻接矩阵,即最近邻,则选择任何顶点,其形成的某些四面体的其余三个剩余顶点必须满足:

(i)它们是所选顶点的直接邻居,

(ii)他们是彼此的直接邻居。如果不是这样,那么你最终将会遇到四面体交叉。

如果我误解了你的陈述,即它不是邻接矩阵,那么你将不得不做 Delaunay Triangulation 的3D版本,即计算3D Voronoi点云的单元格图。 https://en.wikipedia.org/wiki/Voronoi_diagram

答案 1 :(得分:0)

此链接可帮助您找到算法。 http://mathworld.wolfram.com/Tetrahedron.html

答案 2 :(得分:0)

从可能重复的边缘列表开始:

假设您有一个可能重复边缘的ASCII文件。在Unix系统上,这是一种从中提取唯一边列表的简单方法:

cat edges.txt | awk '{printf "%d %d\n",  ($1 < $2 ? $1 : $2),  ($1 > $2 ? $1 : $2)}' | sort | uniq > unique_edges.txt

它的作用:

  1. 'awk'命令确保在每个边缘中,id为较低的顶点 首先出现(因此,将有一种表示文件中相同边缘的方法)
  2. 'sort'命令对所有行进行排序。这将确保 所有重复的边缘都在一起
  3. 'uniq'命令抑制 重复的行
  4. 如果你在Windows下,你可以安装cygwin(有awk,sort和uniq)。在其他脚本语言(例如perl)中执行类似的操作也很容易。

    从四面体列表开始:

    现在,如果你从带有四面体的文件开始,你可以生成一个(重复的)边列表,如下所示(然后你可以运行上面的命令来删除重复项):

    cat tetrahedra.txt | awk '{printf "%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n", $1, $2, $1, $3, $1, $4, $2, $3, $2, $4, $3, $4}' > edges.txt
    

    它的作用:它为每个四面体生成6条边,每条边有一条边。

    显然,您可以组合这两个命令,直接从四面体文件中提取唯一的边缘列表。