]> git.mxchange.org Git - flightgear.git/blob - Math/mat3.h
Wrapped zlib calls so zlib can be optionally disabled.
[flightgear.git] / Math / mat3.h
1 /* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
2
3 /* -------------------------------------------------------------------------
4                        Public MAT3 include file
5    ------------------------------------------------------------------------- */
6
7 #ifndef MAT3_HAS_BEEN_INCLUDED
8 #define MAT3_HAS_BEEN_INCLUDED
9
10 /* -----------------------------  Constants  ------------------------------ */
11
12 /*
13  * Make sure the math library .h file is included, in case it wasn't.
14  */
15
16 #ifndef HUGE
17 #include <math.h>
18 #endif
19 #include <stdio.h>
20
21
22 #ifdef __cplusplus                                                          
23 extern "C" {                            
24 #endif                                   
25
26
27 #define MAT3_DET0       -1                      /* Indicates singular mat */
28 #define MAT3_EPSILON    1e-12                   /* Close enough to zero   */
29 #define MAT3_PI         3.141592653589793       /* Pi                     */
30
31 /* ------------------------------  Types  --------------------------------- */
32
33 typedef double MAT3mat[4][4];           /* 4x4 matrix                    */
34 typedef double MAT3vec[3];              /* Vector                        */
35 typedef double MAT3hvec[4];             /* Vector with homogeneous coord */
36
37 /* ------------------------------  Macros  -------------------------------- */
38
39 /* Tests if a number is within EPSILON of zero */
40 #define MAT3_IS_ZERO(N)         ((N) < MAT3_EPSILON && (N) > -MAT3_EPSILON)
41
42 /* Sets a vector to the three given values */
43 #define MAT3_SET_VEC(V,X,Y,Z)   ((V)[0]=(X), (V)[1]=(Y), (V)[2]=(Z))
44
45 /* Tests a vector for all components close to zero */
46 #define MAT3_IS_ZERO_VEC(V)     (MAT3_IS_ZERO((V)[0]) && \
47                                  MAT3_IS_ZERO((V)[1]) && \
48                                  MAT3_IS_ZERO((V)[2]))
49
50 /* Dot product of two vectors */
51 #define MAT3_DOT_PRODUCT(V1,V2) \
52                         ((V1)[0]*(V2)[0] + (V1)[1]*(V2)[1] + (V1)[2]*(V2)[2])
53
54 /* Copy one vector to other */
55 #define MAT3_COPY_VEC(TO,FROM)  ((TO)[0] = (FROM)[0], \
56                                  (TO)[1] = (FROM)[1], \
57                                  (TO)[2] = (FROM)[2])
58
59 /* Normalize vector to unit length, using TEMP as temporary variable.
60  * TEMP will be zero if vector has zero length */
61 #define MAT3_NORMALIZE_VEC(V,TEMP) \
62         if ((TEMP = sqrt(MAT3_DOT_PRODUCT(V,V))) > MAT3_EPSILON) { \
63            TEMP = 1.0 / TEMP; \
64            MAT3_SCALE_VEC(V,V,TEMP); \
65         } else TEMP = 0.0
66
67 /* Scale vector by given factor, storing result vector in RESULT_V */
68 #define MAT3_SCALE_VEC(RESULT_V,V,SCALE) \
69         MAT3_SET_VEC(RESULT_V, (V)[0]*(SCALE), (V)[1]*(SCALE), (V)[2]*(SCALE))
70
71 /* Adds vectors V1 and V2, storing result in RESULT_V */
72 #define MAT3_ADD_VEC(RESULT_V,V1,V2) \
73         MAT3_SET_VEC(RESULT_V, (V1)[0]+(V2)[0], (V1)[1]+(V2)[1], \
74                                (V1)[2]+(V2)[2])
75
76 /* Subtracts vector V2 from V1, storing result in RESULT_V */
77 #define MAT3_SUB_VEC(RESULT_V,V1,V2) \
78         MAT3_SET_VEC(RESULT_V, (V1)[0]-(V2)[0], (V1)[1]-(V2)[1], \
79                                (V1)[2]-(V2)[2])
80
81 /* Multiplies vectors V1 and V2, storing result in RESULT_V */
82 #define MAT3_MULT_VEC(RESULT_V,V1,V2) \
83         MAT3_SET_VEC(RESULT_V, (V1)[0]*(V2)[0], (V1)[1]*(V2)[1], \
84                                (V1)[2]*(V2)[2])
85
86 /* Sets RESULT_V to the linear combination of V1 and V2, scaled by
87  * SCALE1 and SCALE2, respectively */
88 #define MAT3_LINEAR_COMB(RESULT_V,SCALE1,V1,SCALE2,V2) \
89         MAT3_SET_VEC(RESULT_V,  (SCALE1)*(V1)[0] + (SCALE2)*(V2)[0], \
90                                 (SCALE1)*(V1)[1] + (SCALE2)*(V2)[1], \
91                                 (SCALE1)*(V1)[2] + (SCALE2)*(V2)[2])
92
93 /* Several of the vector macros are useful for homogeneous-coord vectors */
94 #define MAT3_SET_HVEC(V,X,Y,Z,W) ((V)[0]=(X), (V)[1]=(Y), \
95                                   (V)[2]=(Z), (V)[3]=(W))
96
97 #define MAT3_COPY_HVEC(TO,FROM) ((TO)[0] = (FROM)[0], \
98                                  (TO)[1] = (FROM)[1], \
99                                  (TO)[2] = (FROM)[2], \
100                                  (TO)[3] = (FROM)[3])
101
102 #define MAT3_SCALE_HVEC(RESULT_V,V,SCALE) \
103         MAT3_SET_HVEC(RESULT_V, (V)[0]*(SCALE), (V)[1]*(SCALE), \
104                                 (V)[2]*(SCALE), (V)[3]*(SCALE))
105
106 #define MAT3_ADD_HVEC(RESULT_V,V1,V2) \
107         MAT3_SET_HVEC(RESULT_V, (V1)[0]+(V2)[0], (V1)[1]+(V2)[1], \
108                                 (V1)[2]+(V2)[2], (V1)[3]+(V2)[3])
109
110 #define MAT3_SUB_HVEC(RESULT_V,V1,V2) \
111         MAT3_SET_HVEC(RESULT_V, (V1)[0]-(V2)[0], (V1)[1]-(V2)[1], \
112                                 (V1)[2]-(V2)[2], (V1)[3]-(V2)[3])
113
114 #define MAT3_MULT_HVEC(RESULT_V,V1,V2) \
115         MAT3_SET_HVEC(RESULT_V, (V1)[0]*(V2)[0], (V1)[1]*(V2)[1], \
116                                 (V1)[2]*(V2)[2], (V1)[3]*(V2)[3])
117
118 /* ------------------------------  Entries  ------------------------------- */
119
120
121 /* In MAT3geom.c */
122 void            MAT3direction_matrix (MAT3mat result_mat, MAT3mat mat);
123 int             MAT3normal_matrix (MAT3mat result_mat, MAT3mat mat);
124 void            MAT3rotate (MAT3mat result_mat, MAT3vec axis, double angle_in_radians);
125 void            MAT3translate (MAT3mat result_mat, MAT3vec trans);
126 void            MAT3scale (MAT3mat result_mat, MAT3vec scale);
127 void            MAT3shear(MAT3mat result_mat, double xshear, double yshear);
128
129 /* In MAT3mat.c */
130 void            MAT3identity(MAT3mat);
131 void            MAT3zero(MAT3mat);
132 void            MAT3copy (MAT3mat to, MAT3mat from);
133 void            MAT3mult (MAT3mat result, MAT3mat, MAT3mat);
134 void            MAT3transpose (MAT3mat result, MAT3mat);
135 int                     MAT3invert (MAT3mat result, MAT3mat);
136 void            MAT3print (MAT3mat, FILE *fp);
137 void            MAT3print_formatted (MAT3mat, FILE *fp, 
138                                      char *title, char *head, char *format, char *tail);
139 extern int              MAT3equal( void );
140 extern double           MAT3trace( void );
141 extern int              MAT3power( void );
142 extern int              MAT3column_reduce( void );
143 extern int              MAT3kernel_basis( void );
144
145 /* In MAT3vec.c */
146 void            MAT3mult_vec(MAT3vec result_vec, MAT3vec vec, MAT3mat mat);
147 int             MAT3mult_hvec (MAT3hvec result_vec, MAT3hvec vec, MAT3mat mat, int normalize);
148 void            MAT3cross_product(MAT3vec result,MAT3vec,MAT3vec);
149 void            MAT3perp_vec(MAT3vec result_vec, MAT3vec vec, int is_unit);
150
151
152 #ifdef __cplusplus
153 }
154 #endif
155
156
157 #endif /* MAT3_HAS_BEEN_INCLUDED */
158