How do I break a polyhedron into tetrahedra in MATLAB?

1.6k views Asked by At

I have a polyhedron, with a list of vertices (v) and surfaces (s). How do I break this polyhedron into a series of tetrahedra?

I would particularly like to know if there are any built-in MATLAB commands for this.

3

There are 3 answers

3
gnovice On BEST ANSWER

I would suggest trying the built-in function DELAUNAY3. The example given in the documentation link resembles Aaron's answer in that it uses the vertices plus the center point of the polyhedron to create a 3-D Delaunay tessellation, but shabbychef points out that you can still create a tessellation without including the extra point. You can then use TETRAMESH to visualize the resulting tetrahedral elements.

Your code might look something like this (assuming v is an N-by-3 matrix of vertex coordinate values):

v = [v; mean(v)];  %# Add an additional center point, if desired (this code
                   %#   adds the mean of the vertices)
Tes = delaunay3(v(:,1),v(:,2),v(:,3));  %# Create the triangulation
tetramesh(Tes,v);                       %# Plot the tetrahedrons

Since you said in a comment that your polyhedron is convex, you shouldn't have to worry about specifying the surfaces as constraints in order to do the triangulation (shabbychef appears to give a more rigorous and terse proof of this than my comments below do).

NOTE: According to the documentation, DELAUNAY3 will be removed in a future release and DelaunayTri will effectively take its place (although currently it appears that defining constrained edges is still limited to only 2-D triangulations). For the sake of completeness, here is how you would use DelaunayTri and visualize the convex hull (i.e. polyhedral surface) as well:

DT = DelaunayTri(v);  %# Using the same variable v as above
tetramesh(DT);        %# Plot the tetrahedrons
figure;               %# Make new figure window
ch = convexHull(DT);  %# Get the convex hull
trisurf(ch,v(:,1),v(:,2),v(:,3),'FaceColor','cyan');  %# Plot the convex hull
3
shabbychef On

I'm not sure the OP wanted a 'mesh' (Steiner points added) or a tetrahedralization (partition into tetrahedra, no Steiner points added). for a convex polyhedron, the addition of Steiner points (e.g. the 'center' point) is not necessary.

Stack overflow will not allow me to comment on gnovice's post (WTF, SO?), but the proof of the statement "the surfaces of a convex polyhedron are constraints in a Delaunay Tesselation" is rather simple: by definition, a simplex or subsimplex is a member in the Delaunay Tesselation if and only if there is a n-sphere circumscribing the simplex that strictly contains no point in the point set. for a surface triangle, construct the smallest circumscribing sphere, and 'puff' it outwards, away from the polyhedron, towards 'infinity'; eventually it will contain no other point. (in fact, the limit of the circumscribing sphere is a half-space; thus the convex hull is always a subset of the Delaunay Tesselation.)

for more on DT, see Okabe, et. al, 'Spatial Tesselations', or any of the papers by Shewchuk

(my thesis was on this stuff, but I remember less of it than I should...)

5
Aaron Digulla On

For the convex case (no dents in the surface which cause surfaces to cover each other) and a triangle mesh, the simple solution is to calculate the center of the polyhedron and then connect the three corners of every face with the new center.

If you don't have a triangle mesh, then you must triangulate, first. Delaunay triangulation might help.

If there are holes or caves, this can be come arbitrarily complex.