Rotates v1 through an angle (in radians) within the plane defined by v1/v2, returns the rotated vector in n. 
  576         double cos_a = cos(angle);
 
  577         double sin_a = sin(angle);
 
  578         double uxuy, uyuz, uxuz;
 
  579         double ux2, uy2, uz2;
 
  580         double rxx, rxy, rxz, ryx, ryy, ryz, rzx, rzy, rzz;
 
  593         rxx = cos_a + ux2 * (1 - cos_a);
 
  594         rxy = uxuy * (1 - cos_a) - u.
z * sin_a;
 
  595         rxz = uxuz * (1 - cos_a) + u.
y * sin_a;
 
  597         ryx = uxuy * (1 - cos_a) + u.
z * sin_a;
 
  598         ryy = cos_a + uy2 * (1 - cos_a);
 
  599         ryz = uyuz * (1 - cos_a) - u.
x * sin_a;
 
  601         rzx = uxuz * (1 - cos_a) - u.
y * sin_a;
 
  602         rzy = uyuz * (1 - cos_a) + u.
x * sin_a;
 
  603         rzz = cos_a + uz2 * (1 - cos_a);
 
  605         n->
x = rxx * v1->
x + rxy * v1->
y + rxz * v1->
z;
 
  606         n->
y = ryx * v1->
x + ryy * v1->
y + ryz * v1->
z;
 
  607         n->
z = rzx * v1->
x + rzy * v1->
y + rzz * v1->
z;
 
void normalize(POINT3D *p)
Normalize to a unit vector.
void unit_normal(const POINT3D *P1, const POINT3D *P2, POINT3D *normal)
Calculates the unit normal to two vectors, trying to avoid problems with over-narrow or over-wide cas...