Matt, the face recycling is just to save some work for the garbage collector.
I have played with the 3DConvexHullWPF example. Here are my observations:
 Rnd Uniform: operator holds (convexHull.Points.Count() == convexHull.Faces.Count() / 2 + 2)
 Rnd on Sphere: operator hold
 Regular Grid: operator breaks
So I did more digging. If I use convexHull.Faces.SelectMany(f => f.Vertices).Distinct().Count() to count the hull vertices, the operator suddenly holds. Moreover, if I add even tiny amount of noise to the regular grid data (in the order of 1e5
where the vertex indices are integers), the operator holds again.
After some digging I have found the bug that causes V != F/2 + 2. It is in the
CommitCone() function. Due to the "degeneracy" (ie. too many points lying on the same plane) it might happen that the condition
if (newFace.VerticesBeyond.Count == 0)
does not hold for any new face, but the ConvexHull.Add(CurrentVertex); is still executed anyway. So the fix is to check if any new face was added to the hull in the
CommitCone() function and only add the vertex to the hull if that is the case.
To know exactly what's going on with Damian's problem I would have to see the data. Tho I still think that properly adding the noise would solve his problem.
