I would like to mesh the surface of a cloud of points that may not be completely convex, for example the points in this question. Mathematica does not provide triangulation of 3D points, but there is a link to TetGen


 {mypts, mysurface} = TetGenConvexHull[dat];
 Graphics3D[GraphicsComplex[mypts, Polygon[mysurface]], Boxed -> False]

which results in this

enter image description here

Notice it doesn't get the surface meshing associated with subtle twist in the curved shape, and meshes points further away in the goal of creating a convex object. I suppose one could try to mesh the surface piece by piece and slowly merge it as in this answer, but that sounds like a nightmare.

Here is the cloud of points for reference:

enter image description here

  • $\begingroup$ @Öskå I asked myself the same question today lol, then decided to play around with it. $\endgroup$
    – lalmei
    Jun 13, 2014 at 18:28
  • $\begingroup$ Oh I'm sorry I didn't check the beginning of the question :) Deleting comments! $\endgroup$
    – Öskå
    Jun 13, 2014 at 18:33
  • $\begingroup$ One can easily get that $\endgroup$
    – Öskå
    Jun 13, 2014 at 18:38
  • $\begingroup$ @Öskå Does it contain the surface polygons ? If that is the case that is what I need. $\endgroup$
    – lalmei
    Jun 13, 2014 at 18:41
  • $\begingroup$ Generally, ListSurfacePlot3D can do this. However, it won't work well for this particular point cloud. It will work for the other, straight tube that he posted. Representing a surface as a list of points is not precise, and it's generally not a good idea. For example: where are the holes in the surface? However, in some cases this is the only (experimental) data one has. $\endgroup$
    – Szabolcs
    Jun 13, 2014 at 18:57

1 Answer 1


Using Simon's answer (all credit to him):

file = "https://dl.dropboxusercontent.com/u/68983831/curved_pipe02.txt";
dat = Import[file, "Table"];
{pts, tetrahedra} = TetGenDelaunay[dat];
csr[{aa_, bb_, cc_, dd_}] := 
 With[{a = aa - dd, b = bb - dd, c = cc - dd}, 
  Norm[a.a Cross[b, c] + b.b Cross[c, a] + 
     c.c Cross[a, b]]/(2 Norm[a.Cross[b, c]])]
radii = csr[pts[[#]]] & /@ tetrahedra;
alphashape[rmax_] := Pick[tetrahedra, radii, r_ /; r < rmax]
faces[tetras_] := 
 Flatten[tetras /. {a_, b_, c_, 
     d_} :> {{a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}}, 1]
externalfaces[faces_] := 
 Cases[Tally[Sort /@ faces], {face_, 1} :> face]
polys = externalfaces@faces@alphashape[.001];
Graphics3D[GraphicsComplex[pts, Polygon@polys], Boxed -> False]

polys = externalfaces@faces@alphashape[.001];
Graphics3D[GraphicsComplex[pts, Polygon@polys], Boxed -> False]

Mathematica graphics

  • $\begingroup$ Ah! Concave the other word for Non-convex that I didn't search for! $\endgroup$
    – lalmei
    Jun 13, 2014 at 19:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.