?? vector.cpp
字號:
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#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);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -