OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimEcefVector.h
Go to the documentation of this file.
1 //*****************************************************************************
2 // FILE: ossimEcefVector.h
3 //
4 // License: See top level LICENSE.txt file.
5 //
6 // DESCRIPTION:
7 // Contains declaration of a 3D vector object in the Earth-centered, earth
8 // fixed (ECEF) coordinate system.
9 //
10 // NOTE: There is no associated ossimEcefVector.cc file. All methods are
11 // inlined here
12 //
13 // SOFTWARE HISTORY:
14 //>
15 // 08Aug2001 Oscar Kramer
16 // Initial coding.
17 //<
18 //*****************************************************************************
19 // $Id: ossimEcefVector.h 20043 2011-09-06 15:00:55Z oscarkramer $
20 
21 #ifndef ossimEcefVector_HEADER
22 #define ossimEcefVector_HEADER
23 
24 #include <cmath>
25 #include <ossim/base/ossimCommon.h>
28 #include <ossim/base/ossimString.h>
29 #include <ossim/matrix/newmat.h>
30 
31 class ossimGpt;
32 
33 //*****************************************************************************
34 // CLASS: ossimEcefVector
35 //
36 //*****************************************************************************
38 {
39 public:
44  : theData(0,0,0) {}
45 
46  ossimEcefVector(const ossimEcefVector& copy_this)
47  : theData (copy_this.theData) {}
48 
49  ossimEcefVector(const NEWMAT::ColumnVector& assign_this)
50  : theData (assign_this) {}
51 
53  const ossimEcefPoint& to)
54  : theData (to.data() - from.data()) {}
55 
57  const ossimGpt& to)
58  : theData ((ossimEcefPoint(to) - ossimEcefPoint(from)).data()) {}
59 
60  ossimEcefVector(const double& x,
61  const double& y,
62  const double& z)
63  : theData(x, y, z) {}
64 
66  : theData(assign_this) {}
67 
68 
69  void makeNan()
70  {
71  theData[0] = ossim::nan();
72  theData[1] = ossim::nan();
73  theData[2] = ossim::nan();
74  }
75 
76  bool hasNans()const
77  {
78  return ( ossim::isnan(theData[0]) ||
79  ossim::isnan(theData[1]) ||
80  ossim::isnan(theData[2]) );
81  }
82 
83  bool isNan()const
84  {
85  return ( ossim::isnan(theData[0]) &&
86  ossim::isnan(theData[1]) &&
87  ossim::isnan(theData[2]) );
88  }
89 
93  inline ossimEcefVector operator- () const;
94  inline ossimEcefVector operator+ (const ossimEcefVector&) const;
95  inline ossimEcefVector operator- (const ossimEcefVector&) const;
96  inline ossimEcefPoint operator+ (const ossimEcefPoint&) const;
97  inline ossimEcefVector operator* (const double&) const;
98  inline ossimEcefVector operator/ (const double&) const;
99  inline bool operator==(const ossimEcefVector&) const;
100  inline bool operator!=(const ossimEcefVector&) const;
101  inline const ossimEcefVector& operator= (const ossimEcefVector&);
102 
106  inline double dot (const ossimEcefVector&) const;
107  inline double angleTo(const ossimEcefVector&) const; // degrees
108  inline ossimEcefVector cross (const ossimEcefVector&) const;
109  inline ossimEcefVector unitVector() const;
110  inline double magnitude() const; // meters
111  inline double norm2() const; // squared meters
112  inline double length() const;
113  inline double normalize();
114 
118  double x() const { return theData[0]; }
119  double& x() { return theData[0]; }
120  double y() const { return theData[1]; }
121  double& y() { return theData[1]; }
122  double z() const { return theData[2]; }
123  double& z() { return theData[2]; }
124  double& operator [](int idx){return theData[idx];}
125  const double& operator [](int idx)const{return theData[idx];}
126 
127  const ossimColumnVector3d& data() const { return theData; }
128  ossimColumnVector3d& data() { return theData; }
129 
141  ossimString toString(ossim_uint32 precision=15) const;
142 
153  void toPoint(const std::string& s);
154 
156  NEWMAT::ColumnVector toVector() const
157  {
158  NEWMAT::ColumnVector v (3);
159  v(0) = theData[0];
160  v(1) = theData[1];
161  v(2) = theData[2];
162  return v;
163  }
164 
169  { os << "(ossimEcefVector) " << theData; }
170 
171  friend ostream& operator<< (ostream& os , const ossimEcefVector& instance)
172  { instance.print(os); return os; }
173 
174 protected:
176 };
177 
178 //================== BEGIN DEFINITIONS FOR INLINE METHODS =====================
179 
180 //*****************************************************************************
181 // INLINE METHOD: ossimEcefVector::operator-()
182 // Reverses direction of vector.
183 //*****************************************************************************
185 {
186  return ossimEcefVector(-theData);
187 }
188 
189 //*****************************************************************************
190 // INLINE METHOD: ossimEcefVector::operator+(const ossimEcefVector&)
191 //*****************************************************************************
192 inline ossimEcefVector
194 {
195  return ossimEcefVector(theData + v.theData);
196 }
197 
198 //*****************************************************************************
199 // INLINE METHOD: ossimEcefVector::operator-(const ossimEcefVector&)
200 //*****************************************************************************
201 inline ossimEcefVector
203 {
204  return ossimEcefVector(theData - v.theData);
205 }
206 
207 //*****************************************************************************
208 // INLINE METHOD: ossimEcefVector::operator+(const ossimEcefPoint&)
209 //*****************************************************************************
210 inline ossimEcefPoint
212 {
213  return ossimEcefPoint(theData + p.data());
214 }
215 
216 //*****************************************************************************
217 // INLINE METHOD: ossimEcefVector::operator*(const double&)
218 //*****************************************************************************
219 inline ossimEcefVector ossimEcefVector::operator*(const double& scalar) const
220 {
221  return ossimEcefVector(theData*scalar);
222 }
223 
224 //*****************************************************************************
225 // INLINE METHOD: ossimEcefVector::operator/(const double&)
226 //*****************************************************************************
227 inline ossimEcefVector ossimEcefVector::operator/(const double& scalar) const
228 {
229  return ossimEcefVector(theData/scalar);
230 }
231 
232 //*****************************************************************************
233 // INLINE METHOD: ossimEcefVector::operator==(const ossimEcefVector&)
234 //*****************************************************************************
235 inline bool ossimEcefVector::operator==(const ossimEcefVector& v) const
236 {
237  return (theData == v.theData);
238 }
239 
240 //*****************************************************************************
241 // INLINE METHOD: ossimEcefVector::operator!=(const ossimEcefVector&)
242 //*****************************************************************************
243 inline bool ossimEcefVector::operator!=(const ossimEcefVector& v) const
244 {
245  return (theData != v.theData);
246 }
247 
248 //*****************************************************************************
249 // INLINE METHOD: ossimEcefVector::operator=
250 //*****************************************************************************
251 inline const ossimEcefVector&
253 {
254  theData = v.theData;
255  return *this;
256 }
257 
258 //*****************************************************************************
259 // INLINE METHOD: ossimEcefVector::dot()
260 // Computes the scalar product.
261 //*****************************************************************************
262 inline double ossimEcefVector::dot(const ossimEcefVector& v) const
263 {
264  return theData.dot(v.theData);
265 }
266 
267 //*****************************************************************************
268 // INLINE METHOD: ossimEcefVector::angleTo()
269 // Returns the angle subtended (in DEGREES) between this and arg vector
270 //*****************************************************************************
271 inline double ossimEcefVector::angleTo(const ossimEcefVector& v) const
272 {
273  double mag_product = theData.magnitude() * v.theData.magnitude();
274  return ossim::acosd(theData.dot(v.theData)/mag_product);
275 }
276 
277 //*****************************************************************************
278 // INLINE METHOD: ossimEcefVector::cross()
279 // Computes the cross product.
280 //*****************************************************************************
282 {
284 }
285 
286 //*****************************************************************************
287 // INLINE METHOD: ossimEcefVector::unitVector()
288 // Returns a unit vector parallel to this.
289 //*****************************************************************************
291 {
293 }
294 
295 //*****************************************************************************
296 // INLINE METHOD: ossimEcefVector::magnitude()
297 //*****************************************************************************
298 inline double ossimEcefVector::magnitude() const
299 {
300  return theData.magnitude();
301 }
302 
303 //*****************************************************************************
304 // INLINE METHOD: ossimEcefVector::norm2()
305 //*****************************************************************************
306 inline double ossimEcefVector::norm2() const
307 {
308  return theData.norm2();
309 }
310 
311 //*****************************************************************************
312 // INLINE METHOD: ossimEcefVector::length()
313 //*****************************************************************************
314 inline double ossimEcefVector::length() const
315 {
316  return theData.magnitude();
317 }
318 
319 //*****************************************************************************
320 // INLINE METHOD: ossimEcefVector::normalize()
321 // Normalizes this vector.
322 //*****************************************************************************
324 {
325  double result = theData.magnitude();
326  if(result > 1e-15)
327  {
328  theData /= result;
329  }
330 
331  return result;
332 }
333 #endif
334 
335 
const ossimColumnVector3d & data() const
ossim_uint32 x
ossimEcefVector unitVector() const
ossimColumnVector3d cross(const ossimColumnVector3d &rhs) const
ossimRationalNumber operator-(ossim_int32 i, ossimRationalNumber &r)
ossimEcefVector(const ossimColumnVector3d &assign_this)
#define OSSIMDLLEXPORT
double z() const
bool operator!=(const ossimRefPtr< _Tp1 > &__a, const ossimRefPtr< _Tp2 > &__b) noexcept
Definition: ossimRefPtr.h:111
double dot(const ossimColumnVector3d &rhs) const
ossim_uint32 y
ossimEcefVector cross(const ossimEcefVector &) const
double dot(const ossimEcefVector &) const
double nan()
Method to return ieee floating point double precision NAN.
Definition: ossimCommon.h:135
ossimRationalNumber operator/(ossim_int32 i, ossimRationalNumber &r)
ossimEcefVector operator+(const ossimEcefVector &) const
ossimColumnVector3d theData
ossimEcefVector(const NEWMAT::ColumnVector &assign_this)
double magnitude() const
double acosd(double x)
Definition: ossimCommon.h:264
ossimRationalNumber operator*(ossim_int32 i, ossimRationalNumber &r)
const ossimEcefVector & operator=(const ossimEcefVector &)
double norm2() const
ostream & operator<<(ostream &out, const ossimAxes &axes)
Definition: ossimAxes.h:88
ossimColumnVector3d & data()
ossimEcefVector operator-() const
ossimEcefVector(const double &x, const double &y, const double &z)
unsigned int ossim_uint32
ossimEcefVector operator*(const double &) const
bool operator==(const ossimRefPtr< _Tp1 > &__a, const ossimRefPtr< _Tp2 > &__b) noexcept
Definition: ossimRefPtr.h:101
bool isNan() const
ossimEcefVector(const ossimGpt &from, const ossimGpt &to)
double length() const
double x() const
ossimEcefVector(const ossimEcefPoint &from, const ossimEcefPoint &to)
bool hasNans() const
void print(ostream &os=ossimNotify(ossimNotifyLevel_INFO)) const
double y() const
ossimEcefVector(const ossimEcefVector &copy_this)
NEWMAT::ColumnVector toVector() const
Converts this point to a 3D column vector.
const ossimColumnVector3d & data() const
double angleTo(const ossimEcefVector &) const
ossimEcefVector operator/(const double &) const
ossimRationalNumber operator+(ossim_int32 i, ossimRationalNumber &r)
bool operator==(const ossimEcefVector &) const
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
bool isnan(const float &v)
isnan Test for floating point Not A Number (NAN) value.
Definition: ossimCommon.h:91
double norm2() const
speedup
bool operator!=(const ossimEcefVector &) const