Delaunay 三角剖分3D(原理 + 源码)

Delaunay 三角剖分


原理部分请参照我的上一篇博文,传送门:Delaunay 三角剖分2D(原理 + 源码)

3D三角剖分参考文献:

二维与三维的区别


  • 二维时,插入新的一点 P,然后判断 Ptriangle 列表里每个三角形外接圆相对位置关系
  • 三维时,插入新的一点 P,然后判断 Ptetrahedron 列表里每个四面体外接球相对位置关系

二维

在这里插入图片描述

三维

在这里插入图片描述

代码实现< Python版本 >


用到的 lib:

原文链接:https://stackoverflow.com/questions/26434726/return-surface-triangle-of-3d-scipy-spatial-delaunay

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.tri as mtri
from scipy.spatial import Delaunay

# u, v are parameterisation variables
u = np.array([0,0,0.5,1,1]) 
v = np.array([0,1,0.5,0,1]) 

x = u
y = v
z = np.array([0,0,1,0,0])

# Triangulate parameter space to determine the triangles
#tri = mtri.Triangulation(u, v)
tri = Delaunay(np.array([u,v]).T)

print('polyhedron(faces = [')
#for vert in tri.triangles:
for vert in tri.simplices:
    print('[%d,%d,%d],' % (vert[0],vert[1],vert[2]))
print('], points = [')
for i in range(x.shape[0]):
    print('[%f,%f,%f],' % (x[i], y[i], z[i]))
print(']);')


fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

# The triangles in parameter space determine which x, y, z points are
# connected by an edge
#ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral)
ax.plot_trisurf(x, y, z, triangles=tri.simplices, cmap=plt.cm.Spectral)


plt.show()

效果图:

在这里插入图片描述

代码实现< Matlab 版本 >


原文链接:https://www.mathworks.com/help/matlab/ref/delaunaytriangulation.html

x = gallery('uniformdata',[30 1],0);
y = gallery('uniformdata',[30 1],1);
z = gallery('uniformdata',[30 1],2);
DT = delaunayTriangulation(x,y,z)

tetramesh(DT,'FaceAlpha',0.3);

效果图:

在这里插入图片描述

CGAL (Computational Geometry Algorithms Library) 是一个C ++库,提供了许多计算几何算法的实现。其中之一是Delaunay 三角剖分算法,可以通过CGAL库进行实现。 要使用CGAL实现Delaunay 三角剖分,需要定义一些约束条件来限制三角剖分的结果。这些约束条件可以是点、直线、圆或球。在CGAL中,可以使用不同的约束类型来定义这些约束条件,例如Point_2,Line_2,Circle_2等。 一旦定义了约束条件,可以使用CGAL的Delaunay_triangulation_2类来计算Delaunay三角剖分。该类提供了一些函数来插入点、删除点、查询最近邻点、查询包含点的三角形和边界等功能。 下面是一个简单的示例代码,演示如何使用CGAL实现Delaunay 三角剖分: ```c++ #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Delaunay_triangulation_2.h> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Delaunay_triangulation_2<K> Delaunay; int main() { Delaunay dt; dt.insert(K::Point_2(0, 0)); dt.insert(K::Point_2(1, 0)); dt.insert(K::Point_2(0, 1)); dt.insert(K::Point_2(1, 1)); std::cout << "Number of vertices: " << dt.number_of_vertices() << std::endl; std::cout << "Number of triangles: " << dt.number_of_faces() << std::endl; return 0; } ``` 该代码创建了一个Delaunay_triangulation_2对象,并插入了四个点。然后,它打印出了三角形和顶点的数量。 需要注意的是,这只是一个简单的示例,实际上,CGAL提供了更多的功能和选项来控制Delaunay 三角剖分的行为。例如,可以定义不同的距离函数来计算点之间的距离,或者使用其他类型的约束来定义三角剖分
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值