Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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

 Needs["TetGenLink`"]

 {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

share|improve this question
    
@Öskå I asked myself the same question today lol, then decided to play around with it. –  lalmei Jun 13 at 18:28
    
Oh I'm sorry I didn't check the beginning of the question :) Deleting comments! –  Öskå Jun 13 at 18:33
    
One can easily get that –  Öskå Jun 13 at 18:38
    
@Öskå Does it contain the surface polygons ? If that is the case that is what I need. –  lalmei Jun 13 at 18:41
    
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. –  Szabolcs Jun 13 at 18:57

1 Answer 1

up vote 8 down vote accepted

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

Needs["TetGenLink`"]
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

share|improve this answer
    
Ah! Concave the other word for Non-convex that I didn't search for! –  lalmei Jun 13 at 19:49

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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