# Finding the surface area of a 3D convex hull

I have noted several instances here and here where ConvexHullMesh, introduced in v10 has been used to greatly simplify some geometry problems. Determining the volume of a region encompassing a set of 3D points, pts is now simply:

Volume@ConvexHullMesh@pts


Is there an equally simplified method for determining the surface area of this convex hull?

Note, the documentation for ConvexHullMesh suggests that the area can be obtained, using RegionMeasure, however I suspect this is a typo, since RegionMeasure gives an area only if the points have a dimension of 2.

Area@RegionBoundary@ConvexHullMesh@pts


For example, consider a cube, which has volume 1 and surface area 6:

pts = Tuples[{0, 1}, 3];
convexHull = ConvexHullMesh[pts];
convexHullSurface = RegionBoundary[convexHull];
RegionMeasure[convexHull, #] & /@ {0, 1, 2, 3}
(* {∞, ∞, ∞, 1.} *)
RegionMeasure[convexHullSurface, #] & /@ {0, 1, 2, 3}
(* {∞, ∞, 6., 0} *)

• Nice - I was heading down that road, but took a wrong turn at some point. Commented Sep 23, 2014 at 19:31

Here is another way to compute the surface area of a 3D convex hull:

SeedRandom[0]
pts = RandomReal[5, {50, 3}];
chull = ConvexHullMesh @ pts;


Then:

Tr @ PropertyValue[{chull, 2}, MeshCellMeasure]


86.8845076

Update

This approach is good because you have access to individual face areas and with PropertyValue you can do cool things like display the values of the areas on the mesh:

PropertyValue[{chull, {2, All}}, MeshCellLabel] =
Style[NumberForm[#, 3], Bold, Darker@Red, 15] & /@
PropertyValue[{chull, {2, All}}, MeshCellMeasure];


Then:

chull


• Nice, I should have added benchmarking requirements to my original question just to make it challenging. Commented Sep 23, 2014 at 19:58

For fun, here is an approach that uses the graphics generated from the mesh. Lets generate some points:

SeedRandom[0]
pts = RandomReal[5, {50, 3}];
chull = ConvexHullMesh @ pts;


Create a graphics object from it and discretize it:

gr = Graphics3D[GraphicsComplex[MeshCoordinates[chull], {MeshCells[chull, 2]}]];


And here is the area:

Area @ DiscretizeGraphics @ gr


86.8845076

For comparison:

Area @ RegionBoundary @ chull


86.8845076

• Always enjoy a "just for fun" approach. Commented Sep 23, 2014 at 19:32
• @bobthechemist. yeah, me too. Commented Sep 23, 2014 at 19:34

As of version 12, April 16,2019:

Using SurfaceArea:

SeedRandom[0]; (* example borrowed from @RunnyKine *)
pts = RandomReal[5, {50, 3}];

Through[{SurfaceArea, Volume}[ConvexHullMesh@pts]]


{86.8845, 64.3916}

The other example:

pts = Tuples[{0, 1}, 3];
Through[{SurfaceArea, Volume}[ConvexHullMesh@pts]]


{6., 1.}

• Nice to see that SurfaceArea finally works in this context. Thanks for digging up an old post. Commented Dec 20, 2023 at 13:36