На страницу группы практики...
#ifndef _VG4VEC_H_
#define _VG4VEC_H_
typedef double DBL;
typedef struct tagVEC
{
DBL X, Y, Z;
} VEC;
typedef struct tagMATR
{
DBL
A11, A12, A13,
A21, A22, A23,
A31, A32, A33,
A41, A42, A43;
} MATR;
VEC VecSet( DBL X, DBL Y, DBL Z )
{
VEC res;
res.X = X;
res.Y = Y;
res.Z = Z;
return res;
}
VEC VecAddVec( VEC A, VEC B );
VEC VecSubVec( VEC A, VEC B );
VEC VecMulNum( VEC A, DBL N );
VEC VecDivNum( VEC A, DBL N );
DBL VecDotVec( VEC A, VEC B );
VEC VecCrossVec( VEC A, VEC B );
DBL VecLen( VEC A );
DBL VecLen2( VEC A );
VEC VecNormalize( VEC A )
{
DBL len = VecLen2(A);
if (len != 1 && len != 0)
A = VecDivNum(A, sqrt(len));
return A;
}
VEC VecMulMatr( VEC A, MATR M );
MATR MatrSet( DBL A11, DBL A12, DBL A13, DBL A21, ....... );
MATR MatrSetUnit();
MATR MatrSetScale(DBL Sx, DBL Sy, DBL Sz);
MATR MatrSetTranslate(DBL Dx, DBL Dy, DBL Dz);
MATR MatrSetRotateXSiCo( DBL Sin, DBL Cos );
MATR MatrSetRotateX( DBL AngleInDegree );
MATR MatrSetRotateY( DBL AngleInDegree );
MATR MatrSetRotateZ( DBL AngleInDegree );
MATR MatrSetRotate( DBL AngleInDegree, DBL X, DBL Y, DBL Z )
{
DBL a, si, co, len;
MATR m = UnitMatrix;
a = Degree2Radian(AngleInDegree);
si = sin(a);
co = cos(a);
len = X * X + Y * Y + Z * Z;
if (len == 0)
len = 1;
else
if (len != 1)
len = sqrt(len);
X *= si / len;
Y *= si / len;
Z *= si / len;
m.A11 = 1 - 2 * (Y * Y + Z * Z);
m.A12 = 2 * X * Y - 2 * co * Z;
m.A13 = 2 * co * Y + 2 * X * Z;
m.A21 = 2 * X * Y + 2 * co * Z;
m.A22 = 1 - 2 * (X * X + Z * Z);
m.A23 = 2 * Y * Z - 2 * co * X;
m.A31 = 2 * X * Z - 2 * co * Y;
m.A32 = 2 * co * X + 2 * Y * Z;
m.A33 = 1 - 2 * (X * X + Y * Y);
return m;
}
DBL Matr3x3Determ( DBL A11, DBL A12, DBL A13,
DBL A21, DBL A22, DBL A23,
DBL A31, DBL A32, DBL A33 )
{
return
A11 * A22 * A33 +
A12 * A23 * A31 +
A13 * A21 * A32 -
A11 * A23 * A32 -
A12 * A21 * A33 -
A13 * A22 * A31;
}
MATR MatrInverse( MATR M )
{
DBL determ = Matr3x3Determ(M.A11, M.A12, M.A13,
M.A21, M.A22, M.A23,
M.A31, M.A32, M.A33);
MATR r;
if (determ == 0)
return M;
r.A11 =
Matr3x3Determ(M.A22, M.A23, 0,
M.A32, M.A33, 0,
M.A42, M.A43, 1) / determ;
r.A21 =
-Matr3x3Determ(M.A21, M.A23, 0,
M.A31, M.A33, 0,
M.A41, M.A43, 1) / determ;
r.A31 =
Matr3x3Determ(M.A21, M.A22, 0,
M.A31, M.A32, 0,
M.A41, M.A42, 1) / determ;
r.A41 =
-Matr3x3Determ(M.A21, M.A22, M.A23,
M.A31, M.A32, M.A33,
M.A41, M.A42, M.A43) / determ;
r.A12 =
-Matr3x3Determ(M.A12, M.A13, 0,
M.A32, M.A33, 0,
M.A42, M.A43, 1) / determ;
r.A22 =
Matr3x3Determ(M.A11, M.A13, 0,
M.A31, M.A33, 0,
M.A41, M.A43, 1) / determ;
r.A32 =
-Matr3x3Determ(M.A11, M.A12, 0,
M.A31, M.A32, 0,
M.A41, M.A42, 1) / determ;
r.A42 =
Matr3x3Determ(M.A11, M.A12, M.A13,
M.A31, M.A32, M.A33,
M.A41, M.A42, M.A43) / determ;
r.A13 =
Matr3x3Determ(M.A12, M.A13, 0,
M.A22, M.A23, 0,
M.A42, M.A43, 1) / determ;
r.A23 =
-Matr3x3Determ(M.A11, M.A13, 0,
M.A21, M.A23, 0,
M.A41, M.A43, 1) / determ;
r.A33 =
Matr3x3Determ(M.A11, M.A12, 0,
M.A21, M.A22, 0,
M.A41, M.A42, 1) / determ;
r.A43 =
-Matr3x3Determ(M.A11, M.A12, M.A13,
M.A21, M.A22, M.A23,
M.A41, M.A42, M.A43) / determ;
return r;
}
MATR MatrMulMatr( MATR A, MATR B );
#endif /* _VG4VEC_H_ */