FlightGear next
FGColumnVector3.h
Go to the documentation of this file.
1/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3Header: FGColumnVector3.h
4Author: Originally by Tony Peden [formatted and adapted here by Jon Berndt]
5Date 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
26HISTORY
27--------------------------------------------------------------------------------
28??/??/???? ?? Initial version and more.
2903/06/2004 MF Rework, document and do much inlineing.
30
31%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32SENTRY
33%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34
35#ifndef FGCOLUMNVECTOR3_H
36#define FGCOLUMNVECTOR3_H
37
38/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39INCLUDES
40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41
42#include <iosfwd>
43#include <string>
44
45/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46FORWARD DECLARATIONS
47%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48
49namespace JSBSim {
50
51/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52CLASS DOCUMENTATION
53%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54
58
59/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60CLASS DECLARATION
61%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62
64{
65public:
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
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
248
249private:
250 double data[3];
251};
252
256inline double DotProduct(const FGColumnVector3& v1, const FGColumnVector3& v2) {
257 return v1(1)*v2(1) + v1(2)*v2(2) + v1(3)*v2(3);
258}
259
265inline FGColumnVector3 operator*(double scalar, const FGColumnVector3& A) {
266 // use already defined operation.
267 return A*scalar;
268}
269
274std::ostream& operator<<(std::ostream& os, const FGColumnVector3& col);
275
276} // namespace JSBSim
277
278//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
279#endif
This class implements a 3 element column vector.
double operator()(const unsigned int idx) const
Read access the entries of the vector.
bool operator==(const FGColumnVector3 &b) const
Comparison operator.
void InitMatrix(const double a, const double b, const double c)
~FGColumnVector3(void)
Destructor.
std::string Dump(const std::string &delimeter) const
Prints the contents of the vector.
FGColumnVector3 operator/(const double scalar) const
Multiply by 1/scalar.
FGColumnVector3 & operator+=(const FGColumnVector3 &B)
Add an other vector.
FGColumnVector3 operator+(const FGColumnVector3 &B) const
Addition operator.
void InitMatrix(const double a)
double & Entry(const unsigned int idx)
Write access the entries of the vector.
double Entry(const unsigned int idx) const
Read access the entries of the vector.
FGColumnVector3(const FGColumnVector3 &v)
Copy constructor.
FGColumnVector3 & operator*=(const double scalar)
Scale by a scalar.
FGColumnVector3 operator*(const FGColumnVector3 &V) const
Cross product multiplication.
FGColumnVector3 & operator/=(const double scalar)
Scale by a 1/scalar.
FGColumnVector3(const double X, const double Y, const double Z)
Initialization by given values.
FGColumnVector3 operator-(const FGColumnVector3 &B) const
Subtraction operator.
FGColumnVector3 & operator=(std::initializer_list< double > lv)
Assignment operator.
FGColumnVector3 & Normalize(void)
Normalize.
FGColumnVector3 & operator-=(const FGColumnVector3 &B)
Subtract an other vector.
FGColumnVector3 & operator=(const FGColumnVector3 &b)
Assignment operator.
double Magnitude(void) const
Length of the vector.
FGColumnVector3 operator*(const double scalar) const
Multiplication by a scalar.
FGColumnVector3(void)
Default initializer.
double & operator()(const unsigned int idx)
Write access the entries of the vector.
bool operator!=(const FGColumnVector3 &b) const
Comparison operator.
#define B
#define A
#define Z
Definition js_demo.cxx:10
#define Y
ostream & operator<<(ostream &os, const FGColumnVector3 &col)
Write vector to a stream.
FGColumnVector3 operator*(double scalar, const FGColumnVector3 &A)
Scalar multiplication.
double DotProduct(const FGColumnVector3 &v1, const FGColumnVector3 &v2)
Dot product of two vectors Compute and return the euclidean dot (or scalar) product of two vectors v1...