OSDN Git Service

rebuid
[eos/base.git] / src / Objects / General / Matrix3D / doc / Matrix3D.html
1 <HR>
2 <A NAME="Information">
3 <H2>Information from source codes</H2>
4 </A>
5 <PRE>
6 ../src/matrix3DEulerAngleGet.c:
7
8 ../src/matrix3DEulerAngleSet.c:
9
10 ../src/matrix3DEulerAngles.c:
11
12 ../src/matrix3DFile.c:
13
14 ../src/matrix3DInit.c:
15
16 ../src/matrix3DMultiply.c:
17
18 ../src/matrix3DMultiplyMatrix.c:
19
20 ../src/matrix3DMultiplyVector.c:
21
22 ../src/matrix3DRotation.c:
23
24 ../src/matrix3DTranslation.c:
25
26 ../src/matrix3DUtil.c:
27 </PRE>
28 <HR>
29 <A NAME="include">
30 <H2>Matrix3D.h</H2>
31 </A>
32 <PRE>
33 #ifndef MATRIX_3D_H
34 #define MATRIX_3D_H
35 /*
36 # Matrix3D.h  1.13
37 # The latest update : 10/01/97 at 02:34:25
38 #
39 #@(#) Matrix3D.h ver 1.13
40 #@(#) Created by 
41 #@(#)
42 #@(#) Usage : Matrix3D.h 
43 #t@(#) Attention
44 #@(#)
45 */
46 /* constant begin */
47 #define MATRIX_3D_WIDTH  4 
48 #define MATRIX_3D_HEIGHT 4
49
50 #define MATRIX_3D_MODE_NOT_INITIALIZE 0
51 #define MATRIX_3D_MODE_INITIALIZE 1
52
53 #define MATRIX_3D_NEGLECT_VALUE 1e-6 
54
55 /* constant end */
56
57 /* struct begin */
58 typedef float matrix3DParaTypeReal;
59 typedef matrix3DParaTypeReal Matrix3D[MATRIX_3D_WIDTH][MATRIX_3D_HEIGHT];
60
61 typedef char  matrix3DEulerAngleMode;
62
63 typedef struct EulerAngleInfo {
64         char   EAMode[5];
65         double Rot1;
66         double Rot2;
67         double Rot3;
68 } EulerAngleInfo;
69
70 /* struct end */
71
72 /*
73         Matrix3D: Attention Arrays Order
74
75         [0][0] [1][0] [2][0] [3][0]
76         [0][1] [1][1] [2][1] [3][1]
77         [0][2] [1][2] [2][2] [3][2]
78         [0][3] [1][3] [2][3] [3][3]
79 */
80
81 #include "Vector.h"
82 #include <stdio.h>
83
84 #ifdef _cplusplus
85 extern "C" {
86 #endif
87
88 /* prototype begin */
89
90 extern void matrix3DInit(Matrix3D Matrix);
91
92 /* matrix3DUtil.c */
93 #include "Array.h"
94 extern void matrix3DFromRotationMatrix(Matrix3D dst, Array a);
95 extern void matrix3DInverse(Matrix3D mat);
96
97 extern void matrix3DMultiply(Matrix3D A, Matrix3D B);     /* A = A*B */
98 extern void matrix3DMultiplyInv(Matrix3D A, Matrix3D B);  /* B = A*B */
99
100 extern void matrix3DMultiplyVector(floatVector* v, Matrix3D A);
101 extern void matrix3DMultiplyVectors(floatVector* vs, int n, Matrix3D A);
102
103 extern void matrix3DFileFormat(FILE* fpt);
104 extern void matrix3DFileRead(FILE* fpt, Matrix3D Matrix);
105 extern void matrix3DFileWrite(FILE* fpt, Matrix3D Matrix);
106
107
108 extern void matrix3DRotationSet(Matrix3D Matrix, char mode, matrix3DParaTypeReal rot, long Mode);
109 extern void matrix3DTranslationSet(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
110 extern void matrix3DRotationSetXYZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
111 extern void matrix3DRotationSetZYX(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
112 extern void matrix3DRotationSetZXY(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
113 extern void matrix3DRotationSetYXZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
114
115 /*
116  *
117 */
118 extern void matrix3DRotationSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
119 extern void matrix3DRotationAntiSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
120 extern void matrix3DEulerAngleGetFromMatrix3D(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal* rot1, matrix3DParaTypeReal* rot2, matrix3DParaTypeReal* rot3, long mode);
121
122
123 /* prototype end */
124
125 #ifdef _cplusplus
126 };
127 #endif
128
129 /*** Definitions ***/
130 /* struct begin */
131 typedef struct {float x, y, z, w;} Quat; /* Quaternion */
132 typedef matrix3DParaTypeReal HMatrix3D[4][4];
133 typedef Quat EulerAngles;    /* (x,y,z)=ang 1,2,3, w=order code  */
134 /* struct end */
135 /* constant begin */
136 enum QuatPart {X, Y, Z, W};
137 /* constant end */
138
139 /* by Ken Shoemake, 1993 */
140 /*** Order type constants, constructors, extractors ***/
141     /* There are 24 possible conventions, designated by:       */
142     /*    o EulAxI = axis used initially                   : 3 */
143     /*    o EulPar = parity of axis permutation            : 2 */
144     /*    o EulRep = repetition of initial axis as last    : 2 */
145     /*    o EulFrm = frame from which axes are taken       : 2 */
146     /* Axes I,J,K will be a permutation of X,Y,Z.              */
147     /* Axis H will be either I or K, depending on EulRep.      */
148     /* Frame S takes axes from initial static frame.           */
149     /* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then         */
150     /* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v         */
151     /* rotates v around Z by c radians.                                */
152
153 /* constant begin */
154 #define EulFrmS      0
155 #define EulFrmR      1
156 #define EulFrm(ord)  ((unsigned)(ord)&1)
157 #define EulRepNo     0
158 #define EulRepYes    1
159 #define EulRep(ord)  (((unsigned)(ord)>>1)&1)
160 #define EulParEven   0
161 #define EulParOdd    1
162 #define EulPar(ord)  (((unsigned)(ord)>>2)&1)
163 #define EulSafe      "\000\001\002\000"
164 #define EulNext      "\001\002\000\001"
165 /* constant end */
166
167 /* prototype begin */
168 #define EulAxI(ord)  ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))
169 #define EulAxJ(ord)  ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))
170 #define EulAxK(ord)  ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))
171 #define EulAxH(ord)  ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord))
172     /* EulGetOrd unpacks all useful information about order simultaneously. */
173 #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
174     n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
175     /* EulOrd creates an order value between 0 and 23 from 4-tuple choices. */
176 #define EulOrd(i,p,r,f)    (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
177     /* Static axes */
178 #define EulOrdXYZs    EulOrd(X,EulParEven,EulRepNo,EulFrmS)
179 #define EulOrdXYXs    EulOrd(X,EulParEven,EulRepYes,EulFrmS)
180 #define EulOrdXZYs    EulOrd(X,EulParOdd,EulRepNo,EulFrmS)
181 #define EulOrdXZXs    EulOrd(X,EulParOdd,EulRepYes,EulFrmS)
182 #define EulOrdYZXs    EulOrd(Y,EulParEven,EulRepNo,EulFrmS)
183 #define EulOrdYZYs    EulOrd(Y,EulParEven,EulRepYes,EulFrmS)
184 #define EulOrdYXZs    EulOrd(Y,EulParOdd,EulRepNo,EulFrmS)
185 #define EulOrdYXYs    EulOrd(Y,EulParOdd,EulRepYes,EulFrmS)
186 #define EulOrdZXYs    EulOrd(Z,EulParEven,EulRepNo,EulFrmS)
187 #define EulOrdZXZs    EulOrd(Z,EulParEven,EulRepYes,EulFrmS)
188 #define EulOrdZYXs    EulOrd(Z,EulParOdd,EulRepNo,EulFrmS)
189 #define EulOrdZYZs    EulOrd(Z,EulParOdd,EulRepYes,EulFrmS)
190     /* Rotating axes */
191 #define EulOrdZYXr    EulOrd(X,EulParEven,EulRepNo,EulFrmR)
192 #define EulOrdXYXr    EulOrd(X,EulParEven,EulRepYes,EulFrmR)
193 #define EulOrdYZXr    EulOrd(X,EulParOdd,EulRepNo,EulFrmR)
194 #define EulOrdXZXr    EulOrd(X,EulParOdd,EulRepYes,EulFrmR)
195 #define EulOrdXZYr    EulOrd(Y,EulParEven,EulRepNo,EulFrmR)
196 #define EulOrdYZYr    EulOrd(Y,EulParEven,EulRepYes,EulFrmR)
197 #define EulOrdZXYr    EulOrd(Y,EulParOdd,EulRepNo,EulFrmR)
198 #define EulOrdYXYr    EulOrd(Y,EulParOdd,EulRepYes,EulFrmR)
199 #define EulOrdYXZr    EulOrd(Z,EulParEven,EulRepNo,EulFrmR)
200 #define EulOrdZXZr    EulOrd(Z,EulParEven,EulRepYes,EulFrmR)
201 #define EulOrdXYZr    EulOrd(Z,EulParOdd,EulRepNo,EulFrmR)
202 #define EulOrdZYZr    EulOrd(Z,EulParOdd,EulRepYes,EulFrmR)
203
204 EulerAngles Eul_(float ai, float aj, float ah, int order);
205 Quat Eul_ToQuat(EulerAngles ea);
206 void Eul_ToHMatrix(EulerAngles ea, HMatrix3D M);
207 EulerAngles Eul_FromHMatrix(HMatrix3D M, int order);
208 EulerAngles Eul_FromQuat(Quat q, int order);
209 /* prototype end */
210
211 #endif /* MATRIX_3D_H */
212 </PRE>