You can use the undocumented ReturnMeshObject
method like @Simon Woods used herehere to get ListSurfacePlot3D
to do the smoothing for you. With this option added, it returns a GraphicsComplex
ready to be used by DiscretizeGraphics
.
Graphics`Mesh`MeshInit[];
mc = MeshCoordinates[surface];
extractedmesh = DiscretizeGraphics[
First@ListSurfacePlot3D[mc, Method -> {"ReturnMeshObject" -> True},
Mesh -> {15, 15, 15}, MaxPlotPoints -> 10]]
This returns a new mesh with many more interpolated sample points. One can play with the plotting parameters or directly operate on the new region to get the surface to acceptable smoothness.
As for BSplineSurface
et al., the approach taken herehere looks good, where @Belisarius chopped the datapoints into z-slices, interpolated, and used regular points from the interpolated curves to construct BSplineFunction
s. I'm presently trying to replicate this and will add that if I succeed.
Edit: Tweaking parameters
Still no luck making splines work. It shouldn't seem to be as hard as it feels. Does anyone else have the required savoir-faire?
I wanted to add some pictures of how things look with different parameters. Increasing MaxPlotPoints
too much tends to overfit the points, but that's a matter of taste.
(*Mesh -> 50, MaxPlotPoints -> 15*)
(*Mesh -> 50, MaxPlotPoints -> 25*)