www.pudn.com > HumanAnimation.rar > VECTOR.CPP
#include "stdafx.h" #include#include #include "vector.h" #include "body.h" void vecPrint (vector v) { printf ("[%f %f %f]\n", v[0], v[1], v[2]); } void vecCopy (vector dest, vector src) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; } float vecLength (vector u) { return sqrt (u[0] * u[0] + u[1] * u[1] + u[2] * u[2]); } float vecLengthSq (vector u) { return (u[0] * u[0] + u[1] * u[1] + u[2] * u[2]); } float vecDist (vector u, vector v) { return sqrt ((v[0] - u[0]) * (v[0] - u[0]) + (v[1] - u[1]) * (v[1] - u[1]) + (v[2] - u[2]) * (v[2] - u[2])); } float vecDistSq (vector u, vector v) { return ((v[0] - u[0]) * (v[0] - u[0]) + (v[1] - u[1]) * (v[1] - u[1]) + (v[2] - u[2]) * (v[2] - u[2])); } void vecSub (vector dest, vector u, vector v) { vector res; res[0] = u[0] - v[0]; res[1] = u[1] - v[1]; res[2] = u[2] - v[2]; vecCopy (dest, res); } void vecAdd (vector dest, vector u, vector v) { vector res; res[0] = u[0] + v[0]; res[1] = u[1] + v[1]; res[2] = u[2] + v[2]; vecCopy (dest, res); } void vecMult (vector dest, float c, vector u) { vector res; res[0] = u[0] * c; res[1] = u[1] * c; res[2] = u[2] * c; vecCopy (dest, res); } float vecDot (vector u, vector v) { return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]); } float vecAngle (vector u, vector v) { return acos (vecDot (u, v) / (vecLength (u) * vecLength (v))); } void vecCross (vector dest, vector u, vector v) { vector res; res[0] = u[1] * v[2] - u[2] * v[1]; res[1] = u[2] * v[0] - u[0] * v[2]; res[2] = u[0] * v[1] - u[1] * v[0]; vecCopy (dest, res); } void vecNormalize (vector dest, vector v) { float length; length = vecLength (v); if (length != 0) { vecMult (dest, 1 / length, v); } } float vecDistPointToPlane (vector r, plane p) { return (p[0] * r[0] + p[1] * r[1] + p[2] * r[2] + p[3]); } void vecPlaneFromPointAndNormal (plane dest, vector p, vector N) { dest[0] = N[0]; dest[1] = N[1]; dest[2] = N[2]; dest[3] = -((N[0] * p[0]) + (N[1] * p[1]) + (N[2] * p[2])); } void vecSpherical (vector dest, float theta, float phi) { dest[0] = (float)sin (theta) * (float)cos (phi); dest[1] = (float)sin (theta) * (float)sin (phi); dest[2] = (float)cos (theta); } void vecRotateX (vector dest, vector src, float angle) { float s; float c; vector result; s = (float)sin (angle * VEC_DEG_TO_RAD); c = (float)cos (angle * VEC_DEG_TO_RAD); result[0] = src[0]; result[1] = src[1] * c + src[2] * s; result[2] = -src[1] * s + src[2] * c; vecCopy (dest, result); } void vecRotateY (vector dest, vector src, float angle) { float s; float c; vector result; s = (float)sin (angle * VEC_DEG_TO_RAD); c = (float)cos (angle * VEC_DEG_TO_RAD); result[0] = src[0] * c - src[2] * s; result[1] = src[1]; result[2] = src[0] * s + src[2] * c; vecCopy (dest, result); } void vecRotateZ (vector dest, vector src, float angle) { float s; float c; vector result; s = (float)sin (angle * VEC_DEG_TO_RAD); c = (float)cos (angle * VEC_DEG_TO_RAD); result[0] = src[0] * c + src[1] * s; result[1] = -src[0] * s + src[1] * c; result[2] = src[2]; vecCopy (dest, result); } void vecRotate (vector dest, vector p, vector axis, float angle) { float c; float s; float t; float x, y, z; float x2, y2, z2; float R[3][3]; vector result; c = (float)cos (angle); s = (float)sin (angle); t = 1 - c; x = axis[0]; y = axis[1]; z = axis[2]; x2 = x * x; y2 = y * y; z2 = z * z; R[0][0] = (t * x2) + c; R[1][0] = (t * x * y) - (s * z); R[2][0] = (t * x * z) + (s * y); R[0][1] = (t * x * y) + (s * z); R[1][1] = (t * y2) + c; R[2][1] = (t * y * z) - (s * x); R[0][2] = (t * x * z) - (s * y); R[1][2] = (t * y * z) + (s * x); R[2][2] = (t * z2) + c; result[0] = (p[0] * R[0][0]) + (p[1] * R[1][0]) + (p[2] * R[2][0]); result[1] = (p[0] * R[0][1]) + (p[1] * R[1][1]) + (p[2] * R[2][1]); result[2] = (p[0] * R[0][2]) + (p[1] * R[1][2]) + (p[2] * R[2][2]); vecCopy (dest, result); } void vecMatch (float *angle, vector axis, vector u, vector v) { vecCross (axis, u, v); vecNormalize (axis, axis); *angle = acos (vecDot (u, v)); } void vecSetValue(vector dest, float x, float y, float z) { vector result; result[X] = x; result[Y] = y; result[Z] = z; vecCopy(dest, result); } void vecTranslate(vector dest, float x, float y, float z) { vector result; result[X] = dest[X] + x; result[Y] = dest[Y] + y; result[Z] = dest[Z] + z; vecCopy(dest, result); }