00001
00005 #ifndef __sm_matrix_h__
00006 #define __sm_matrix_h__
00007
00008
00009 #ifndef VEC3_DEFINED
00010 #define VEC3_DEFINED
00011 typedef float vec3[3];
00012 typedef float mat3[3][3];
00013 #endif
00014
00016 void smZero(vec3 A);
00017
00018 void smCopy(mat3 a, mat3 b);
00020 void smCopy(vec3 a, vec3 b);
00021 void smCopy(vec3 *a, vec3 *b, int len);
00022
00024 void smAdd(vec3 a, vec3 b);
00026 void smAdd(vec3 a, vec3 b, vec3 c);
00027
00028 void smAdd(vec3 a, vec3 *in_vec, int count);
00029 void smAdd(vec3 a, vec3 *in_vec, vec3 *out_vec, int count);
00030
00031
00033 void smSub(vec3 a, vec3 b, vec3 c) ;
00034
00035 void smSub(vec3 *in_vec, vec3 a, vec3 *out_vec, int count);
00036
00037 void smSub(vec3 a, vec3 *in_vec, vec3 *out_vec, int count);
00038
00039 void smSub(vec3 *in_vec, vec3 a, int count);
00040
00041
00043 void smMultMat(mat3 a, mat3 b, mat3 c);
00044
00046 void smMultMat( mat3 u, vec3 in_vec);
00048 void smMultMat( mat3 u, vec3 *in_vec, int len);
00050 void smMultMat( mat3 u, vec3 *in_vec, vec3 *out_vec, int len);
00051
00052
00053 void smMultVec(vec3 a, mat3 b) ;
00054 void smMultVec(vec3 a, mat3 b, vec3 a_out);
00055 void smMultVec(vec3 *a, mat3 b, int len);
00056 void smMultVec(vec3 *a, mat3 b, vec3 *a_out, int len );
00057
00058
00059
00060
00061 float smDotProduct(vec3 a, vec3 b);
00062 float smVectorAngle(vec3 point1, vec3 point2, vec3 center);
00063 float smVectorAngle(vec3 point1, vec3 point2);
00064
00065
00067 int smInverseMatrix(float original_matrix[3][3], float inverse_matrix[3][3]) ;
00068
00069
00071 void smMinus(vec3 a) ;
00072
00074 float smNorm(vec3 a) ;
00075
00077 void smNormalize(vec3 a) ;
00078
00079
00080 float smDistance(vec3 a, vec3 b);
00081
00083 void smCrossProduct(vec3 a, vec3 b, vec3 c) ;
00084
00085 void smComputeConvertMatrix(vec3 a, vec3 b, vec3 c, float convert_matrix[3][3]);
00086
00089 void smMakeRotationMatrix(float angle, vec3 C, float rot_mat[3][3]);
00090
00093 char smCalcMinRmsdRotation( vec3 *vec_a, vec3 *vec_b, int len, float matrix[3][3]);
00094
00096 char smMoveMinRmsd( vec3 *vec_a, vec3 *vec_b, int len );
00097
00098 char smCalcMinRmsdRotationTri( vec3 *vec_a, vec3 *vec_b, float matrix[3][3]);
00099
00102 void smMoveMeanOrigin( vec3 *vec_a, int len_a, vec3 *vec_b );
00105 void smMoveMeanOrigin( vec3 *vec_a, int len_a );
00106
00107 void smCalcMeanOrigin( vec3 *vec_a, int len_a, vec3 mean );
00108
00109 float smCalcRmsd( vec3 *vec_a, vec3 *vec_b, int len );
00110 float smCalcInterRmsd( vec3 *vec_a, vec3 *vec_b, int len );
00111
00112 float smCalcFrobeniusNorm( float matrix_a[3][3], float matrix_b[3][3] );
00113
00114 #endif