It is desirable for the cube to have flat faces. Another gotcha when creating smooth normals is duplicate vertices. These can be eliminated by 'welding' vertices that are closer than a tolerance to each other. Then the normals are recalculated. See figure 2 for an example of this.
Different models require different edge tolerance angles.
Sometimes the angle across some edges is the same as the angle between some geometry that should be smooth. This is a problem with my current algorithm. It could be dealt with by localizing the averaging according to user defined areas. Generates smooth vertex normals for a model. First builds a list of all the triangles each vertex is in.