Li, I would think a more natural representation of normals would be to associate the normal to each triangle with the center (centroid) of that same triangle. That way you can use the precise normal that can be calculated for each triangle rather than an approximation for normals at the vertices. I am not sure of the best way to weight different triangles' normals surrounding a particular vertex.
If a triangle has the three vertices P1 = [x1,y1,z1], P2 = [x2,y2,z2], and P3 = [x3,y3,z3], then its centroid is located at
P0 = (P1+P2+P3)/3.
A unit normal to this triangle can be computed as
u = cross(P2P1,P3P1);
u = u/norm(u); % Make u of unit length
This normal will point inward or outward depending on the direction of the path
P1 > P2 > P3 > P1,
relative to the inner/outer directions of the surface. Pointing the fingers of your right hand in the direction of this triangular path, your thumb would point in the direction of the normal, u, as calculated above, assuming the x,y,z axes are in righthand orientation.
That last should answer siva's question 1. For question 2. the angle between two vectors, v1 and v2, is given by:
angle = atan2(norm(cross(v1,v2)),dot(v1,v2));
It is independent of the lengths of v1 and v2, and ranges between 0 and pi radians.
Roger Stafford
