1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 Author: Originally by Tony Peden [formatted here (and broken??) by JSB]
6 Purpose: FGMatrix33 class
10 --------------------------------------------------------------------------------
13 --------------------------------------------------------------------------------
15 03/16/2000 JSB Added exception throwing
17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
21 #include "FGMatrix33.h"
22 #include "FGColumnVector3.h"
24 static const char *IdSrc = "$Id$";
25 static const char *IdHdr = ID_MATRIX33;
27 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
31 double** FGalloc(void)
39 tmp = new double [16];
50 A[0] = new double [4];
51 if (!A[0]) return NULL;
52 A[1] = new double [4];
53 if (!A[1]) return NULL;
54 A[2] = new double [4];
55 if (!A[2]) return NULL;
56 A[3] = new double [4];
57 if (!A[3]) return NULL;
63 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 void dealloc(double **A)
71 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73 FGMatrix33::FGMatrix33(void)
79 if (debug_lvl & 2) cout << "Instantiated: FGMatrix33" << endl;
82 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
84 FGMatrix33::FGMatrix33(int r, int c)
90 if (debug_lvl & 2) cout << "Instantiated: FGMatrix33" << endl;
93 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95 FGMatrix33::FGMatrix33(const FGMatrix33& M)
105 data[1][1] = M.data[1][1];
106 data[1][2] = M.data[1][2];
107 data[1][3] = M.data[1][3];
108 data[2][1] = M.data[2][1];
109 data[2][2] = M.data[2][2];
110 data[2][3] = M.data[2][3];
111 data[3][1] = M.data[3][1];
112 data[3][2] = M.data[3][2];
113 data[3][3] = M.data[3][3];
115 if (debug_lvl & 2) cout << "Instantiated: FGMatrix33" << endl;
118 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120 FGMatrix33::~FGMatrix33(void)
125 if (debug_lvl & 2) cout << "Destroyed: FGMatrix33" << endl;
128 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130 ostream& operator<<(ostream& os, const FGMatrix33& M)
132 for (unsigned int i=1; i<=M.Rows(); i++) {
133 for (unsigned int j=1; j<=M.Cols(); j++) {
134 if (i == M.Rows() && j == M.Cols())
137 os << M.data[i][j] << ", ";
143 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145 FGMatrix33& FGMatrix33::operator<<(const float ff)
147 data[rowCtr][colCtr] = ff;
148 if (++colCtr > Cols()) {
150 if (++rowCtr > Rows())
156 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
158 istream& operator>>(istream& is, FGMatrix33& M)
160 for (unsigned int i=1; i<=M.Rows(); i++) {
161 for (unsigned int j=1; j<=M.Cols(); j++) {
168 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
170 FGMatrix33& FGMatrix33::operator=(const FGMatrix33& M)
173 if (data != NULL) dealloc(data);
182 data[1][1] = M.data[1][1];
183 data[1][2] = M.data[1][2];
184 data[1][3] = M.data[1][3];
185 data[2][1] = M.data[2][1];
186 data[2][2] = M.data[2][2];
187 data[2][3] = M.data[2][3];
188 data[3][1] = M.data[3][1];
189 data[3][2] = M.data[3][2];
190 data[3][3] = M.data[3][3];
196 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
198 void FGMatrix33::SetOParams(char delim,int width,int prec,int origin)
200 FGMatrix33::delim = delim;
201 FGMatrix33::width = width;
202 FGMatrix33::prec = prec;
203 FGMatrix33::origin = origin;
206 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
208 void FGMatrix33::InitMatrix(double value)
223 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
225 void FGMatrix33::InitMatrix(void)
230 // *****************************************************************************
231 // binary operators ************************************************************
232 // *****************************************************************************
234 FGMatrix33 FGMatrix33::operator-(const FGMatrix33& M)
238 Diff(1,1) = data[1][1] - M(1,1);
239 Diff(1,2) = data[1][2] - M(1,2);
240 Diff(1,3) = data[1][3] - M(1,3);
241 Diff(2,1) = data[2][1] - M(2,1);
242 Diff(2,2) = data[2][2] - M(2,2);
243 Diff(2,3) = data[2][3] - M(2,3);
244 Diff(3,1) = data[3][1] - M(3,1);
245 Diff(3,2) = data[3][2] - M(3,2);
246 Diff(3,3) = data[3][3] - M(3,3);
252 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254 void FGMatrix33::operator-=(const FGMatrix33 &M)
256 data[1][1] -= M(1,1);
257 data[1][2] -= M(1,2);
258 data[1][3] -= M(1,3);
259 data[2][1] -= M(2,1);
260 data[2][2] -= M(2,2);
261 data[2][3] -= M(2,3);
262 data[3][1] -= M(3,1);
263 data[3][2] -= M(3,2);
264 data[3][3] -= M(3,3);
268 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270 FGMatrix33 FGMatrix33::operator+(const FGMatrix33& M)
274 Sum(1,1) = data[1][1] + M(1,1);
275 Sum(1,2) = data[1][2] + M(1,2);
276 Sum(1,3) = data[1][3] + M(1,3);
277 Sum(2,1) = data[2][1] + M(2,1);
278 Sum(2,2) = data[2][2] + M(2,2);
279 Sum(2,3) = data[2][3] + M(2,3);
280 Sum(3,1) = data[3][1] + M(3,1);
281 Sum(3,2) = data[3][2] + M(3,2);
282 Sum(3,3) = data[3][3] + M(3,3);
287 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
289 void FGMatrix33::operator+=(const FGMatrix33 &M)
291 data[1][1] += M(1,1);
292 data[1][2] += M(1,2);
293 data[1][3] += M(1,3);
294 data[2][1] += M(2,1);
295 data[2][2] += M(2,2);
296 data[2][3] += M(2,3);
297 data[3][1] += M(3,1);
298 data[3][2] += M(3,2);
299 data[3][3] += M(3,3);
303 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305 FGMatrix33 FGMatrix33::operator*(const double scalar)
309 Product(1,1) = data[1][1] * scalar;
310 Product(1,2) = data[1][2] * scalar;
311 Product(1,3) = data[1][3] * scalar;
312 Product(2,1) = data[2][1] * scalar;
313 Product(2,2) = data[2][2] * scalar;
314 Product(2,3) = data[2][3] * scalar;
315 Product(3,1) = data[3][1] * scalar;
316 Product(3,2) = data[3][2] * scalar;
317 Product(3,3) = data[3][3] * scalar;
322 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
324 FGMatrix33 operator*(double scalar, FGMatrix33 &M)
328 Product(1,1) = M(1,1) * scalar;
329 Product(1,2) = M(1,2) * scalar;
330 Product(1,3) = M(1,3) * scalar;
331 Product(2,1) = M(2,1) * scalar;
332 Product(2,2) = M(2,2) * scalar;
333 Product(2,3) = M(2,3) * scalar;
334 Product(3,1) = M(3,1) * scalar;
335 Product(3,2) = M(3,2) * scalar;
336 Product(3,3) = M(3,3) * scalar;
341 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
343 void FGMatrix33::operator*=(const double scalar)
346 data[1][1] *= scalar;
347 data[1][2] *= scalar;
348 data[1][3] *= scalar;
349 data[2][1] *= scalar;
350 data[2][2] *= scalar;
351 data[2][3] *= scalar;
352 data[3][1] *= scalar;
353 data[3][2] *= scalar;
354 data[3][3] *= scalar;
358 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
360 FGMatrix33 FGMatrix33::operator*(const FGMatrix33& M)
364 Product(1,1) = data[1][1]*M(1,1) + data[1][2]*M(2,1) + data[1][3]*M(3,1);
365 Product(1,2) = data[1][1]*M(1,2) + data[1][2]*M(2,2) + data[1][3]*M(3,2);
366 Product(1,3) = data[1][1]*M(1,3) + data[1][2]*M(2,3) + data[1][3]*M(3,3);
367 Product(2,1) = data[2][1]*M(1,1) + data[2][2]*M(2,1) + data[2][3]*M(3,1);
368 Product(2,2) = data[2][1]*M(1,2) + data[2][2]*M(2,2) + data[2][3]*M(3,2);
369 Product(2,3) = data[2][1]*M(1,3) + data[2][2]*M(2,3) + data[2][3]*M(3,3);
370 Product(3,1) = data[3][1]*M(1,1) + data[3][2]*M(2,1) + data[3][3]*M(3,1);
371 Product(3,2) = data[3][1]*M(1,2) + data[3][2]*M(2,2) + data[3][3]*M(3,2);
372 Product(3,3) = data[3][1]*M(1,3) + data[3][2]*M(2,3) + data[3][3]*M(3,3);
377 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
379 void FGMatrix33::operator*=(const FGMatrix33& M)
383 a = data[1][1]; b=data[1][2]; c=data[1][3];
384 data[1][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
385 data[1][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
386 data[1][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
388 a = data[2][1]; b=data[2][2]; c=data[2][3];
389 data[2][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
390 data[2][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
391 data[2][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
393 a = data[3][1]; b=data[3][2]; c=data[3][3];
394 data[3][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
395 data[3][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
396 data[3][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
400 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402 FGMatrix33 FGMatrix33::operator/(const double scalar)
407 double tmp = 1.0/scalar;
408 Quot(1,1) = data[1][1] * tmp;
409 Quot(1,2) = data[1][2] * tmp;
410 Quot(1,3) = data[1][3] * tmp;
411 Quot(2,1) = data[2][1] * tmp;
412 Quot(2,2) = data[2][2] * tmp;
413 Quot(2,3) = data[2][3] * tmp;
414 Quot(3,1) = data[3][1] * tmp;
415 Quot(3,2) = data[3][2] * tmp;
416 Quot(3,3) = data[3][3] * tmp;
419 mE.Message = "Attempt to divide by zero in method FGMatrix33::operator/(const double scalar)";
425 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
427 void FGMatrix33::operator/=(const double scalar)
430 double tmp = 1.0/scalar;
442 mE.Message = "Attempt to divide by zero in method FGMatrix33::operator/=(const double scalar)";
447 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
449 void FGMatrix33::T(void)
451 for (unsigned int i=1; i<=3; i++) {
452 for (unsigned int j=i+1; j<=3; j++) {
453 double tmp = data[i][j];
454 data[i][j] = data[j][i];
460 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
462 FGColumnVector3 FGMatrix33::operator*(const FGColumnVector3& Col)
464 FGColumnVector3 Product;
466 Product(1) = data[1][1]*Col(1) + data[1][2]*Col(2) + data[1][3]*Col(3);
467 Product(2) = data[2][1]*Col(1) + data[2][2]*Col(2) + data[2][3]*Col(3);
468 Product(3) = data[3][1]*Col(1) + data[3][2]*Col(2) + data[3][3]*Col(3);
473 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
475 void FGMatrix33::Debug(void)
477 //TODO: Add your source code here
480 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%