volume calculation from the DelaunayTri(x,y,z) function

39 views (last 30 days)
Nikola Soukupová on 21 Apr 2024
Commented: Matt J on 22 Apr 2024
I have the data in X,Y,Z format.
Then I entered a function into script:
rng default;
DT=DelaunayTri(x,y,z)
tetramesh(DT,'FaceAlpha',0.3)
The question is, how do I calculate the volume from this Delaunay Triangulation?
Thank you for the answer.

John D'Errico on 21 Apr 2024
Edited: John D'Errico on 21 Apr 2024
Its not THAT hard. You compute the volume of each simplex in the tessellation. Sum the absolute values up. (Since those simplexes may have random signs.)
As an example, I'll create a set of simplexes that lie in a rectangular box, of edge lengths [1 2 4]. So the volume would be just a little less than 8.
xyz = rand(10000,3).*[1 2 4];
Tess = delaunayTriangulation(xyz)
Tess =
delaunayTriangulation with properties: Points: [10000x3 double] ConnectivityList: [66176x4 double] Constraints: []
Now, to write a little code, probably something I should have posted online before. I've attached the DTvolume code to this response.
V = DTvolume(Tess)
V = 7.9009
The code I wrote does a little extra, to avoid numerical problems to whatever extent possible. And of course, it is fully vectorized, and even works for 2-d triangulations.

Walter Roberson on 21 Apr 2024
DT = DelaunayTri(x,y,z);
[~, Volume] = convexhull(DT);