JSBSim Flight Dynamics Model  1.1.11 (13 Feb 2022)
An Open Source Flight Dynamics and Control Software Library in C++
FGColumnVector3.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3 Header: FGColumnVector3.h
4 Author: Originally by Tony Peden [formatted and adapted here by Jon Berndt]
5 Date started: Unknown
6 
7  ------ Copyright (C) 2001 by Tony Peden and 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 ??/??/???? ?? Initial version and more.
29 03/06/2004 MF Rework, document and do much inlineing.
30 
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 SENTRY
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34 
35 #ifndef FGCOLUMNVECTOR3_H
36 #define FGCOLUMNVECTOR3_H
37 
38 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 INCLUDES
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41 
42 #include <iosfwd>
43 #include <string>
44 
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 FORWARD DECLARATIONS
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48 
49 namespace JSBSim {
50 
51 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 CLASS DOCUMENTATION
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54 
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS DECLARATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62 
64 {
65 public:
68  FGColumnVector3(void);
69 
75  FGColumnVector3(const double X, const double Y, const double Z) {
76  data[0] = X;
77  data[1] = Y;
78  data[2] = Z;
79  }
80 
85  data[0] = v.data[0];
86  data[1] = v.data[1];
87  data[2] = v.data[2];
88  }
89 
91  ~FGColumnVector3(void) { }
92 
98  double operator()(const unsigned int idx) const { return data[idx-1]; }
99 
105  double& operator()(const unsigned int idx) { return data[idx-1]; }
106 
115  double Entry(const unsigned int idx) const { return data[idx-1]; }
116 
125  double& Entry(const unsigned int idx) { return data[idx-1]; }
126 
130  std::string Dump(const std::string& delimeter) const;
131 
136  data[0] = b.data[0];
137  data[1] = b.data[1];
138  data[2] = b.data[2];
139  return *this;
140  }
141 
145  FGColumnVector3& operator=(std::initializer_list<double> lv) {
146  double *v = data;
147  for(auto &x : lv)
148  *(v++) = x;
149 
150  return *this;
151  }
152 
156  bool operator==(const FGColumnVector3& b) const {
157  return data[0] == b.data[0] && data[1] == b.data[1] && data[2] == b.data[2];
158  }
159 
163  bool operator!=(const FGColumnVector3& b) const { return ! operator==(b); }
164 
169  FGColumnVector3 operator*(const double scalar) const {
170  return FGColumnVector3(scalar*data[0], scalar*data[1], scalar*data[2]);
171  }
172 
177  FGColumnVector3 operator/(const double scalar) const;
178 
185  return FGColumnVector3( data[1] * V.data[2] - data[2] * V.data[1],
186  data[2] * V.data[0] - data[0] * V.data[2],
187  data[0] * V.data[1] - data[1] * V.data[0] );
188  }
189 
192  return FGColumnVector3( data[0] + B.data[0], data[1] + B.data[1],
193  data[2] + B.data[2] );
194  }
195 
198  return FGColumnVector3( data[0] - B.data[0], data[1] - B.data[1],
199  data[2] - B.data[2] );
200  }
201 
204  data[0] -= B.data[0];
205  data[1] -= B.data[1];
206  data[2] -= B.data[2];
207  return *this;
208  }
209 
212  data[0] += B.data[0];
213  data[1] += B.data[1];
214  data[2] += B.data[2];
215  return *this;
216  }
217 
219  FGColumnVector3& operator*=(const double scalar) {
220  data[0] *= scalar;
221  data[1] *= scalar;
222  data[2] *= scalar;
223  return *this;
224  }
225 
227  FGColumnVector3& operator/=(const double scalar);
228 
229  void InitMatrix(void) { data[0] = data[1] = data[2] = 0.0; }
230  void InitMatrix(const double a) { data[0] = data[1] = data[2] = a; }
231  void InitMatrix(const double a, const double b, const double c) {
232  data[0]=a; data[1]=b; data[2]=c;
233  }
234 
237  double Magnitude(void) const;
238 
242  double Magnitude(const int idx1, const int idx2) const;
243 
247  FGColumnVector3& Normalize(void);
248 
249 private:
250  double data[3];
251 };
252 
256 inline double DotProduct(const FGColumnVector3& v1, const FGColumnVector3& v2) {
257  return v1(1)*v2(1) + v1(2)*v2(2) + v1(3)*v2(3);
258 }
259 
265 inline FGColumnVector3 operator*(double scalar, const FGColumnVector3& A) {
266  // use already defined operation.
267  return A*scalar;
268 }
269 
274 std::ostream& operator<<(std::ostream& os, const FGColumnVector3& col);
275 
276 } // namespace JSBSim
277 
278 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
279 #endif
JSBSim::FGColumnVector3::operator()
double operator()(const unsigned int idx) const
Read access the entries of the vector.
Definition: FGColumnVector3.h:98
JSBSim::FGColumnVector3::operator*=
FGColumnVector3 & operator*=(const double scalar)
Scale by a scalar.
Definition: FGColumnVector3.h:219
JSBSim::FGColumnVector3::operator/
FGColumnVector3 operator/(const double scalar) const
Multiply by 1/scalar.
Definition: FGColumnVector3.cpp:82
JSBSim::FGColumnVector3
This class implements a 3 element column vector.
Definition: FGColumnVector3.h:63
JSBSim::FGColumnVector3::operator()
double & operator()(const unsigned int idx)
Write access the entries of the vector.
Definition: FGColumnVector3.h:105
JSBSim::FGColumnVector3::~FGColumnVector3
~FGColumnVector3(void)
Destructor.
Definition: FGColumnVector3.h:91
JSBSim::FGColumnVector3::operator-=
FGColumnVector3 & operator-=(const FGColumnVector3 &B)
Subtract an other vector.
Definition: FGColumnVector3.h:203
JSBSim::FGColumnVector3::operator/=
FGColumnVector3 & operator/=(const double scalar)
Scale by a 1/scalar.
Definition: FGColumnVector3.cpp:95
JSBSim::FGColumnVector3::operator*
FGColumnVector3 operator*(const double scalar) const
Multiplication by a scalar.
Definition: FGColumnVector3.h:169
JSBSim::FGColumnVector3::FGColumnVector3
FGColumnVector3(void)
Default initializer.
Definition: FGColumnVector3.cpp:55
JSBSim::FGColumnVector3::Dump
std::string Dump(const std::string &delimeter) const
Prints the contents of the vector.
Definition: FGColumnVector3.cpp:63
JSBSim::FGColumnVector3::FGColumnVector3
FGColumnVector3(const double X, const double Y, const double Z)
Initialization by given values.
Definition: FGColumnVector3.h:75
JSBSim::FGColumnVector3::operator*
FGColumnVector3 operator*(const FGColumnVector3 &V) const
Cross product multiplication.
Definition: FGColumnVector3.h:184
JSBSim::FGColumnVector3::operator+=
FGColumnVector3 & operator+=(const FGColumnVector3 &B)
Add an other vector.
Definition: FGColumnVector3.h:211
JSBSim::FGColumnVector3::Magnitude
double Magnitude(void) const
Length of the vector.
Definition: FGColumnVector3.cpp:109
JSBSim::FGColumnVector3::operator+
FGColumnVector3 operator+(const FGColumnVector3 &B) const
Addition operator.
Definition: FGColumnVector3.h:191
JSBSim::FGColumnVector3::FGColumnVector3
FGColumnVector3(const FGColumnVector3 &v)
Copy constructor.
Definition: FGColumnVector3.h:84
JSBSim::FGColumnVector3::Entry
double & Entry(const unsigned int idx)
Write access the entries of the vector.
Definition: FGColumnVector3.h:125
JSBSim::FGColumnVector3::operator=
FGColumnVector3 & operator=(const FGColumnVector3 &b)
Assignment operator.
Definition: FGColumnVector3.h:135
JSBSim::FGColumnVector3::operator-
FGColumnVector3 operator-(const FGColumnVector3 &B) const
Subtraction operator.
Definition: FGColumnVector3.h:197
JSBSim::FGColumnVector3::Normalize
FGColumnVector3 & Normalize(void)
Normalize.
Definition: FGColumnVector3.cpp:116
JSBSim::FGColumnVector3::operator!=
bool operator!=(const FGColumnVector3 &b) const
Comparison operator.
Definition: FGColumnVector3.h:163
JSBSim::FGColumnVector3::Entry
double Entry(const unsigned int idx) const
Read access the entries of the vector.
Definition: FGColumnVector3.h:115
JSBSim::FGColumnVector3::operator=
FGColumnVector3 & operator=(std::initializer_list< double > lv)
Assignment operator.
Definition: FGColumnVector3.h:145
JSBSim::FGColumnVector3::operator==
bool operator==(const FGColumnVector3 &b) const
Comparison operator.
Definition: FGColumnVector3.h:156