To approximate Gaussian curvature at a vertex, we take the sum of the angles incident to the vertex, and subtract this sum from 360 degrees. If the vertex is in the bottom of a bowl shape or on top of a dome shape, the incident angles will have a sum less than 360 degrees, resulting in positive Gaussian curvature, and if the vertex is a saddle point, the incident angles will have a sum greater than 360 degrees, resulting in negative Gaussian curvature.


To approximate mean curvature at a vertex v, we use the formula from the paper by Hsu, Kusner, and Sullivan:



![]()
![]()
To measure "overall" curvature, we consider a combination of the Gaussian
curvature and the mean curvature. Some possible combinations:
(G = Gaussian curvature, H = mean curvature, k1 = maximum principal curvature,
k2 = minimum principal curvature, so G = k1*k2, H = (k1+k2)/2):
Using the discrete curvature approximations from above, we must consider the problem of finding a suitable functional whose minimization results in fairing of a surface. To do this, we consider several "penalty" functions that measure the difference between a vertex's curvature measure and its neighbors'. The basic formula is to take the absolute value of the difference between a vertex's curvature measure and its neighbors', but for this we must find a suitable weighting scheme for the neighboring vertices' curvature values:
In this scheme, to calculate the curvature "penalty" at a vertex v, we take the simple average of the curvature measures of the neighbors of v and compare the average with the curvature measure at v; the "penalty" is simply the absolute value of the difference. Though this scheme is very simple, this ignores the relative distances of the neighbors.
In this scheme, instead of taking the simple average, we give each neighbor of v a weight inversely proportional to the length of the edge connecting v to the neighbor, and normalize the weights so they add up to 1. The "penalty" is then the absolute value of the weighted average and the curvature measure at v. This scheme takes into account the relative distances of the neighbors, giving more weight to neighbors that are closer to v. However, if one edge is nearly 0, this will cause the weight of that vertex to be almost 1, causing the others to have almost zero weight, which will obscure the effect they should have on the curvature at v.
This scheme is the same as above, except that instead of giving each neighbor a weight inversely proportional to the distance from the vertex, we fit the weights to a Gaussian distribution. The distance from the vertex v to a neighbor determines the x-coordinate of the weight for that vertex on the Gaussian distribution; the curve is shifted so that the weights sum to 1. This has the advantage of giving more weight to neighbors that are closer to v as in the above scheme, but it is less likely to give weights extremely close to 1 to any vertex. However, because the Gaussian distribution is defined by an exponential function, it becomes difficult to find the scale factor to make the weights sum to 1.
In this scheme, we give each neighbor of v a weight that is proportional to the sum of the angle made at v by the edges to the two vertices on either side of the neighbor and the angle made at the neighbor in the polygon connecting the vertices adjacent to v. (I'll put a picture here which is much less confusing.) This scheme takes into account the relative distances to each neighbor in addition to their positions relative to each other, so that vertices that are hidden behind others are given a smaller weight.
Given a suitable "penalty" function, we wish to move the vertices on a mesh in such a way as to decrease the "penalty" at each vertex.
The discrete gradient is calculated as follows:
Instead of approximating the gradient by a finite difference, we calculate the "penalty" for a vertex v in the following positions: