"Surface Area" of $k$ simplex in $\mathbb{R}^{k}$?

When one searches on the internet for "surface of a simplex", one tends to find this site first, but no real answer is given, so I will post the three solutions I came up with, which are based on rotation, reflection, and projection, respectively.

As already mentioned, the surface of the simplex is the sum of the surface of its facets. The surface of a facet is the volume of the simplex it represents in (N-1)-dimensional space. The formula for a simplex volume can be found in many places, (e.g. https://en.wikipedia.org/wiki/Simplex#Volume) and is assumed known. The facets of a simplex are simply the enumeration of the sets of simplex vertices dropping 1 vertex at the time.

The difficulty then lies in reducing the number of dimensions of the facet vertices coordinates by one, so we can apply the (N-1)D volume formula. I came up with three options. All of them rely on having the normal vector to the plane the facet lies in. Note that by definition the facet is always in a plane (e.g. 3 points in 3D space). Getting the normal vector to the plane these vertices define is discussed elsewhere as well, and need not be repeated here (see "generalized cross-product", which involves calculating N determinants from N (N-1)x(N-1)-matrices, i.e. one det() for each coordinate axis). I will also assume the normal vector we have is normalized (length 1).

The first option one has to drop a dimension is to find that rotation which maps the normal vector onto one of the coordinate axis. Then we can apply that rotation to the facet coordinates, which will rotate the facet to a plane perpendicular to the chosen coordinate axis, i.e. all coordinate values of the facet vertices along that axis will be the same. We can therefore drop that dimension. The difficulty is in finding the original rotation needed to rotate the normal vector onto the coordinate axis. N-dimensional rotations are hard, and typically require first increasing the number of dimensions by 1. I chose not to implement this.

A second option one has is to reflect the facet across a well-chosen mirror plane in such a way that the facet maps onto a plane perpendicular to a particular coordinate axis; for implementation simplicity I typically choose the last axis. Given the normal and the coordinate axis unit vector, finding the reflection plane is easy: its normal is basically just the difference vector between these two given vectors. Using this reflection plane normal, one can construct a reflection matrix, a so-called Householder matrix. Details can be found on the wikipedia page on Householder transformation (https://en.wikipedia.org/wiki/Householder_transformation). Using this matrix, one can reflect the facet onto a plane perpendicular to the chosen coordinate axis, allowing us to drop that coordinate to reduce to an (N-1)-dimensional space. It's easy to implement with some matrix math. I had one difficulty with my own implementation: when I swap vertices, the sign of the surface should invert; this did not happen for me, so I probably missed a $\pm1$ factor somewhere. In the end, I do not use this method for production either.

The third and simplest option I could come up with is to project the facet onto one of the coordinate system planes. This requires no matrix math other than calculating the normal vector of the facet and the volume of the (N-1) simplex. First one choses which coordinate plane one wants to project on. The normal vector is "most (anti)parallel" to one of the coordinate axis; this is the dimension where its component is largest in absolute value. The maximum angle to that axis is $\pi$/4 (45 degrees). Hence, choosing the coordinate plane perpendicular to this coordinate axis as the plane of projection gives the smallest projection distortion of all coordinate system planes, which reduced round-off errors and catastrophic edge cases (e.g. projection onto a line). The actual projection onto that plane is easy: simply drop that coordinate from all facet vertex coordinate vectors. Obviously, unless the original normal is exactly (anti)parallel to the chosen coordinate axis, the projected facet is distorted, more specifically it is scaled down along the direction of the projected normal, by a scaling factor that depends on the angle between the original normal and the projected normal. Calculate the volume from the (N-1)D simplex; this gives you the surface of the (scaled) projected facet. Then we scale the surface area back up to the size of the original facet. The length of the projected normal (which is the length of the normal vector with the chosed axis coordinate dropped) divided by the length of the original normal (1 here as we use a normalized length) is the sinus of the angle between the normal vector and the projected normal vector. The cosine of that angle gives us the distortion of the facet along the direction of the projected normal. Hence the projected facet scaling = cos(arcsin(length_projected_normal)), always a value between 1 and 0.707106781 (i.e. cos($\pi$/4)). We scale the predicted surface area up by dividing the calculated scaled surface area by this number. Our choice of projection coordinate plane ensures that the round-off errors are expected to be minimal, i.e. it avoids projecting the facet by a very oblique angle or even on a single line. This third method is my preferred method as it is easy to implement and is computationally the lightest method.


The surface area is just the sum of the $k-1$ dimensional volumes of the faces. If you think in three space, the surface of a tetrahedron is the sum of the 2-volumes (areas) of the faces. So the surface area is $$\sum\left|\det\left( \begin{array}{ccc} 1 & \ldots & 1 \\ x_1^{\top} & \ldots & x_{k+1}^{\top} \end{array} \right)\right|$$ where there are $k+1$ terms in the sum. Each term deletes one of the $x_i$, so the determinant is of order $k$. For each term of the sum, you need to find a hyperplane of dimension $k-1$ that the face lives in, then find coordinates for the corresponding points in that hyperplane, then take the determinant.


Suppose that $v_1,\ldots,v_m\in\mathbb{R}^k$. The $m$-dimensional volume of the parallelepiped spanned by these vectors can be computed form their Gram-determinant.

The volume of the parallelepiped is $$ \sqrt{\det\begin{pmatrix} v_1\cdot v_1 & \dots & v_1\cdot v_m \\ \vdots & \ddots & \vdots \\ v_m\cdot v_1 & \dots & v_m\cdot v_m \\ \end{pmatrix}}. $$

The volume of the simplex that is the convex hull of $0,v_1,\ldots,v_m$ is $$ \frac1{m!} \sqrt{\det\begin{pmatrix} v_1\cdot v_1 & \dots & v_1\cdot v_m \\ \vdots & \ddots & \vdots \\ v_m\cdot v_1 & \dots & v_m\cdot v_m \\ \end{pmatrix}}. $$