JSBSim Flight Dynamics Model  1.2.1 (08 Aug 2024)
An Open Source Flight Dynamics and Control Software Library in C++
FGMatrix33.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3 Header: FGMatrix33.h
4 Author: Tony Peden, Jon Berndt, Mathias Frolich
5 Date started: Unknown
6 
7  ------------- Copyright (C) 2001 Jon S. Berndt (jon@jsbsim.org) -------------
8 
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free
11  Software Foundation; either version 2 of the License, or (at your option) any
12  later version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17  details.
18 
19  You should have received a copy of the GNU Lesser General Public License along
20  with this program; if not, write to the Free Software Foundation, Inc., 59
21  Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 
23  Further information about the GNU Lesser General Public License can also be
24  found on the world wide web at http://www.gnu.org.
25 
26 HISTORY
27 --------------------------------------------------------------------------------
28 ??/??/?? TP Created
29 03/16/2000 JSB Added exception throwing
30 03/06/2004 MF Rework of the code to make it a bit compiler friendlier
31 
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33 SENTRY
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
35 
36 #ifndef FGMATRIX33_H
37 #define FGMATRIX33_H
38 
39 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 INCLUDES
41 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42 
43 #include <string>
44 #include <iosfwd>
45 
46 #include "FGJSBBase.h"
47 #include "FGColumnVector3.h"
48 
49 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 FORWARD DECLARATIONS
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52 
53 namespace JSBSim {
54 
55 class FGQuaternion;
56 
57 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 CLASS DOCUMENTATION
59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
60 
65 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 DECLARATION: FGMatrix33
67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
68 
69 class JSBSIM_API FGMatrix33
70 {
71 public:
72 
73  enum {
74  eRows = 3,
75  eColumns = 3
76  };
77 
82  FGMatrix33(void);
83 
91  {
92  data[0] = M.data[0];
93  data[1] = M.data[1];
94  data[2] = M.data[2];
95  data[3] = M.data[3];
96  data[4] = M.data[4];
97  data[5] = M.data[5];
98  data[6] = M.data[6];
99  data[7] = M.data[7];
100  data[8] = M.data[8];
101  }
102 
117  FGMatrix33(const double m11, const double m12, const double m13,
118  const double m21, const double m22, const double m23,
119  const double m31, const double m32, const double m33)
120  {
121  data[0] = m11;
122  data[1] = m21;
123  data[2] = m31;
124  data[3] = m12;
125  data[4] = m22;
126  data[5] = m32;
127  data[6] = m13;
128  data[7] = m23;
129  data[8] = m33;
130  }
131 
134  ~FGMatrix33(void) {}
135 
139  std::string Dump(const std::string& delimeter) const;
140 
146  std::string Dump(const std::string& delimiter, const std::string& prefix) const;
147 
155  double operator()(unsigned int row, unsigned int col) const {
156  return data[(col-1)*eRows+row-1];
157  }
158 
168  double& operator()(unsigned int row, unsigned int col) {
169  return data[(col-1)*eRows+row-1];
170  }
171 
185  double Entry(unsigned int row, unsigned int col) const {
186  return data[(col-1)*eRows+row-1];
187  }
188 
202  double& Entry(unsigned int row, unsigned int col) {
203  return data[(col-1)*eRows+row-1];
204  }
205 
209  unsigned int Rows(void) const { return eRows; }
210 
214  unsigned int Cols(void) const { return eColumns; }
215 
221  FGMatrix33 Transposed(void) const {
222  return FGMatrix33( data[0], data[1], data[2],
223  data[3], data[4], data[5],
224  data[6], data[7], data[8] );
225  }
226 
230  void T(void);
231 
235  void InitMatrix(void);
236 
240  void InitMatrix(const double m11, const double m12, const double m13,
241  const double m21, const double m22, const double m23,
242  const double m31, const double m32, const double m33)
243  {
244  data[0] = m11;
245  data[1] = m21;
246  data[2] = m31;
247  data[3] = m12;
248  data[4] = m22;
249  data[5] = m32;
250  data[6] = m13;
251  data[7] = m23;
252  data[8] = m33;
253  }
254 
257  FGQuaternion GetQuaternion(void) const;
258 
261  FGColumnVector3 GetEuler() const;
262 
266  double Determinant(void) const;
267 
275  bool Invertible(void) const { return 0.0 != Determinant(); }
276 
283  FGMatrix33 Inverse(void) const;
284 
292  {
293  data[0] = A.data[0];
294  data[1] = A.data[1];
295  data[2] = A.data[2];
296  data[3] = A.data[3];
297  data[4] = A.data[4];
298  data[5] = A.data[5];
299  data[6] = A.data[6];
300  data[7] = A.data[7];
301  data[8] = A.data[8];
302  return *this;
303  }
304 
310  FGMatrix33& operator=(std::initializer_list<double> lv)
311  {
312  double *v = data;
313  for(auto& x: lv) {
314  *v = x;
315  v += 3;
316  if (v-data > 8)
317  v -= 8;
318  }
319 
320  return *this;
321  }
322 
331  FGColumnVector3 operator*(const FGColumnVector3& v) const;
332 
341  FGMatrix33 operator-(const FGMatrix33& B) const;
342 
351  FGMatrix33 operator+(const FGMatrix33& B) const;
352 
361  FGMatrix33 operator*(const FGMatrix33& B) const;
362 
371  FGMatrix33 operator*(const double scalar) const;
372 
381  FGMatrix33 operator/(const double scalar) const;
382 
391  FGMatrix33& operator-=(const FGMatrix33 &B);
392 
401  FGMatrix33& operator+=(const FGMatrix33 &B);
402 
411  FGMatrix33& operator*=(const FGMatrix33 &B);
412 
421  FGMatrix33& operator*=(const double scalar);
422 
431  FGMatrix33& operator/=(const double scalar);
432 
433 private:
434  double data[eRows*eColumns];
435 };
436 
444 inline FGMatrix33 operator*(double scalar, const FGMatrix33& A) {
445  // use already defined operation.
446  return A*scalar;
447 }
448 
456 JSBSIM_API std::ostream& operator<<(std::ostream& os, const FGMatrix33& M);
457 
465 JSBSIM_API std::istream& operator>>(std::istream& is, FGMatrix33& M);
466 
467 } // namespace JSBSim
468 #endif
This class implements a 3 element column vector.
Handles matrix math operations.
Definition: FGMatrix33.h:70
FGMatrix33 Transposed(void) const
Transposed matrix.
Definition: FGMatrix33.h:221
FGMatrix33 & operator=(const FGMatrix33 &A)
Assignment operator.
Definition: FGMatrix33.h:291
double & operator()(unsigned int row, unsigned int col)
Write access the entries of the matrix.
Definition: FGMatrix33.h:168
unsigned int Cols(void) const
Number of cloumns in the matrix.
Definition: FGMatrix33.h:214
~FGMatrix33(void)
Destructor.
Definition: FGMatrix33.h:134
FGMatrix33(const FGMatrix33 &M)
Copy constructor.
Definition: FGMatrix33.h:90
FGMatrix33(const double m11, const double m12, const double m13, const double m21, const double m22, const double m23, const double m31, const double m32, const double m33)
Initialization by given values.
Definition: FGMatrix33.h:117
void InitMatrix(const double m11, const double m12, const double m13, const double m21, const double m22, const double m23, const double m31, const double m32, const double m33)
Initialize the matrix.
Definition: FGMatrix33.h:240
FGMatrix33 & operator=(std::initializer_list< double > lv)
Assignment operator.
Definition: FGMatrix33.h:310
double Entry(unsigned int row, unsigned int col) const
Read access the entries of the matrix.
Definition: FGMatrix33.h:185
double & Entry(unsigned int row, unsigned int col)
Write access the entries of the matrix.
Definition: FGMatrix33.h:202
double operator()(unsigned int row, unsigned int col) const
Read access the entries of the matrix.
Definition: FGMatrix33.h:155
unsigned int Rows(void) const
Number of rows in the matrix.
Definition: FGMatrix33.h:209
bool Invertible(void) const
Return if the matrix is invertible.
Definition: FGMatrix33.h:275
Models the Quaternion representation of rotations.
Definition: FGQuaternion.h:86