OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimColumnVector3d.h
Go to the documentation of this file.
1 //*******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Garrett Potts
6 //
7 // Description: This is a 3-D vector without the homogeneous
8 // coordinate.
9 //
10 //*******************************************************************
11 // $Id: ossimColumnVector3d.h 20074 2011-09-08 16:16:27Z gpotts $
12 #ifndef ossimColumnVector3d_HEADER
13 #define ossimColumnVector3d_HEADER
16 #include <float.h> // for FLT_EPSILON
17 #include <iomanip>
18 #include <iostream>
19 #include <cmath>
20 using namespace std;
21 
22 #include <ossim/matrix/newmat.h>
23 #include <ossim/base/ossimString.h>
24 
26 {
27 public:
29  {
30  data[0]=0;
31  data[1]=0;
32  data[2]=0;
33  }
34 
35  ossimColumnVector3d(double x, double y, double z=0)
36  {
37  data[0]=x;
38  data[1]=y;
39  data[2]=z;
40  }
41 
42  // Default copy-constructor is perfect
43  // ossimColumnVector3d(const ossimColumnVector3d &rhs) = default;
44 
45  explicit ossimColumnVector3d(const NEWMAT::ColumnVector& rhs)
46  {
47  if ( (rhs.Ncols() == 1) && (rhs.Nrows() > 2) )
48  {
49  data[0] = rhs[0];
50  data[1] = rhs[1];
51  data[2] = rhs[2];
52  }
53  else
54  {
55  data[0]=0;
56  data[1]=0;
57  data[2]=0;
58  }
59  }
60 
61  const ossimColumnVector3d& operator=(const NEWMAT::ColumnVector& rhs)
62  {
63  if ( (rhs.Ncols() == 1) && (rhs.Nrows() == 3) )
64  {
65  data[0] = rhs[0];
66  data[1] = rhs[1];
67  data[2] = rhs[2];
68  }
69  return *this;
70  }
71 
73  {
74  return out << setiosflags(ios::fixed) << setprecision(15)
75  << v[0] << " " << v[1] <<" "
76  << v[2];
77  }
78 
79  friend ossimColumnVector3d operator*(double scalar,
80  const ossimColumnVector3d &v)
81  {
82  return ossimColumnVector3d(v.data[0]*scalar,
83  v.data[1]*scalar,
84  v.data[2]*scalar);
85  }
86 
93  friend ossimColumnVector3d operator*(const NEWMAT::Matrix& lhs,
94  const ossimColumnVector3d& rhs)
95  {
96  if ((lhs.Ncols() == 3) && (lhs.Nrows() == 3))
97  {
98  return ossimColumnVector3d( (lhs[0][0]*rhs[0] + lhs[0][1]*rhs[1] + lhs[0][2]*rhs[2]),
99  (lhs[1][0]*rhs[0] + lhs[1][1]*rhs[1] + lhs[1][2]*rhs[2]),
100  (lhs[2][0]*rhs[0] + lhs[2][1]*rhs[1] + lhs[2][2]*rhs[2]));
101  }
102  else if((lhs.Ncols() == 4) && (lhs.Nrows() == 4))
103  {
104  return ossimColumnVector3d( (lhs[0][0]*rhs[0] + lhs[0][1]*rhs[1] + lhs[0][2]*rhs[2] + lhs[0][3]) ,
105  (lhs[1][0]*rhs[0] + lhs[1][1]*rhs[1] + lhs[1][2]*rhs[2] + lhs[1][3]) ,
106  (lhs[2][0]*rhs[0] + lhs[2][1]*rhs[1] + lhs[2][2]*rhs[2] + lhs[2][3]));
107  }
108  ossimNotify(ossimNotifyLevel_WARN) << "Multiplying a 3 row column vector by an invalid matrix" << std::endl;
109  return rhs;
110  }
111 
112  double& operator [](int index)
113  {
114  return data[index];
115  }
116 
117  const double& operator [](int index)const
118  {
119  return data[index];
120  }
121 
122  ossimColumnVector3d operator*(double scalar)const
123  {
124  return ossimColumnVector3d(data[0]*scalar,
125  data[1]*scalar,
126  data[2]*scalar);
127  }
128 
130  {
131  return ossimColumnVector3d( data[0]+rhs[0],
132  data[1]+rhs[1],
133  data[2]+rhs[2]);
134  }
135 
136  const ossimColumnVector3d& operator +=(const ossimColumnVector3d &rhs)
137  {
138  data[0] += rhs[0];
139  data[1] += rhs[1];
140  data[2] += rhs[2];
141 
142  return *this;
143  }
144 
146  {
147  return ossimColumnVector3d(-data[0],
148  -data[1],
149  -data[2]);
150  }
151 
152  ossimColumnVector3d operator /(double scalar)const
153  {
154  return ossimColumnVector3d( data[0]/scalar,
155  data[1]/scalar,
156  data[2]/scalar);
157  }
158 
159  const ossimColumnVector3d& operator /=(double scalar)
160  {
161  data[0]/=scalar;
162  data[1]/=scalar;
163  data[2]/=scalar;
164 
165  return *this;
166  }
167 
169  {
170  return ossimColumnVector3d( data[0]-rhs[0],
171  data[1]-rhs[1],
172  data[2]-rhs[2]);
173  }
174 
175  const ossimColumnVector3d& operator -=(const ossimColumnVector3d &rhs)
176  {
177  data[0] -= rhs[0];
178  data[1] -= rhs[1];
179  data[2] -= rhs[2];
180 
181  return *this;
182  }
183 
184  bool operator ==(const ossimColumnVector3d &rhs) const
185  { return ((fabs(data[0] - rhs[0]) <= FLT_EPSILON) &&
186  (fabs(data[1] - rhs[1]) <= FLT_EPSILON) &&
187  (fabs(data[2] - rhs[2]) <= FLT_EPSILON));
188  }
189 
190  bool operator !=(const ossimColumnVector3d &rhs) const
191  { return !(*this == rhs); }
192 
193  double magnitude()const
194  {
195  return sqrt(data[0]*data[0] +
196  data[1]*data[1] +
197  data[2]*data[2]);
198  }
199  inline double norm2()const
200  {
201  return data[0]*data[0] +
202  data[1]*data[1] +
203  data[2]*data[2];
204  }
205  double dot(const ossimColumnVector3d &rhs) const
206  {
207  return (data[0]*rhs[0]+
208  data[1]*rhs[1]+
209  data[2]*rhs[2]);
210  }
211 
213  {
214  double mag = magnitude();
215 
216  if(fabs(mag) > FLT_EPSILON)
217  {
218  mag = 1.0/mag;
219  return (*this *mag);
220  }
221 
222  return *this;
223  }
224 
226  {
227  return ossimColumnVector3d( data[1]*rhs[2] - data[2]*rhs[1],
228  data[2]*rhs[0] - data[0]*rhs[2],
229  data[0]*rhs[1] - data[1]*rhs[0]);
230  }
231 
233  {
234  data[0] = 1;
235  data[1] = 0;
236  data[2] = 0;
237 
238  return *this;
239  }
241  {
242  data[0] = 0;
243  data[1] = 1;
244  data[2] = 0;
245 
246  return *this;
247  }
249  {
250  data[0] = 0;
251  data[1] = 0;
252  data[2] = 1;
253 
254  return *this;
255  }
256 
268  ossimString toString(ossim_uint32 precision=15) const;
269 
280  void toPoint(const std::string& s);
281 
282 private:
283  double data[3];
284 };
285 
286 
287 
288 #endif
ossim_uint32 x
ossimColumnVector3d cross(const ossimColumnVector3d &rhs) const
const ossimColumnVector3d & yAligned()
ossimRationalNumber operator-(ossim_int32 i, ossimRationalNumber &r)
#define OSSIMDLLEXPORT
bool operator!=(const ossimRefPtr< _Tp1 > &__a, const ossimRefPtr< _Tp2 > &__b) noexcept
Definition: ossimRefPtr.h:111
double dot(const ossimColumnVector3d &rhs) const
ossim_uint32 y
ossimRationalNumber operator/(ossim_int32 i, ossimRationalNumber &r)
ossimColumnVector3d unit() const
ossimColumnVector3d operator*(double scalar) const
friend ossimColumnVector3d operator*(const NEWMAT::Matrix &lhs, const ossimColumnVector3d &rhs)
ossimColumnVector3d(double x, double y, double z=0)
const ossimColumnVector3d & operator=(const NEWMAT::ColumnVector &rhs)
ostream & operator<<(ostream &out, const ossimAxes &axes)
Definition: ossimAxes.h:88
ossimColumnVector3d(const NEWMAT::ColumnVector &rhs)
#define FLT_EPSILON
friend ossimColumnVector3d operator*(double scalar, const ossimColumnVector3d &v)
unsigned int ossim_uint32
bool operator==(const ossimRefPtr< _Tp1 > &__a, const ossimRefPtr< _Tp2 > &__b) noexcept
Definition: ossimRefPtr.h:101
const ossimColumnVector3d & xAligned()
ossimRationalNumber operator+(ossim_int32 i, ossimRationalNumber &r)
const ossimColumnVector3d & zAligned()
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
double norm2() const
speedup