Is there a straight forward way to plot a non-convex surface in R?
I have used something like the following for convex surfaces and it works fine:
xyz <- cbind(y,x,z)
tbr <- t(surf.tri(xyz, delaunayn(xyz)))
rgl.triangles(xyz[tbr,1], xyz[tbr,2], xyz[tbr,3])
However, for non-convex surfaces, concave areas become filled. I think this is a problem with the function delaunayn()
as it uses the Qhull library which does not support constrained Delaunay triangulations or mesh generation of non-convex objects.
Any suggestions appreciated.
P.S.
I have data as an ascii file but it has 3 columns and is 225 lines long. What is the best way of providing this?
Data available at: http://pastebin.com/R2p4Cf7d
The top of the plot should be concave! This is an image created using persp3d()
of how the surface should look. It has been calculated using more grid points on a regular grid in polar coordinates, rather than using irregular collocation points.
I feel
deldir::deldir()
does something better thangeometry::delaunayn()
in this case (as a memorial to a new functionrgl::plot3d.deldir()
). (I used OP's Data.)The following solution is not perfect, but works if you have a copy of Matlab.
The code produces the following two surfaces. The left plot is based on triangulation generated by the R function delaunayn(), and the right plot is based on triangulation generated from the Matlab function delaunay().
The Matlab generated data is available at: http://pastebin.com/vQV2Zaii
and the associated Matblab code is:
The result is not entirely perfect as the final plot (right) has a spurious triangle.
I hope the above will be useful to anyone with a similar problem.