Isis 3 Programmer Reference
Displacement.cpp
Go to the documentation of this file.
1 
20 #include "Displacement.h"
21 
22 #include "Distance.h"
23 #include "IException.h"
24 #include "IString.h"
25 #include "SpecialPixel.h"
26 
27 namespace Isis {
28 
35  }
36 
37 
43  Displacement::Displacement(const Distance &distanceToCopy) {
44  // Use meters because it is the stored format, no precision loss
45  setDisplacement(distanceToCopy.meters(), Meters);
46  }
47 
48 
59  Displacement::Displacement(double displacement, Units displacementUnit) {
60  if(displacementUnit == Pixels)
61  displacementUnit = Meters;
62 
63  setDisplacement(displacement, displacementUnit);
64  }
65 
66 
75  Displacement::Displacement(double displacementInPixels,
76  double pixelsPerMeter) {
77  setDisplacement(displacementInPixels / pixelsPerMeter, Meters);
78  }
79 
80 
86  double Displacement::meters() const {
87  return displacement(Meters);
88  }
89 
90 
97  void Displacement::setMeters(double displacementInMeters) {
98  setDisplacement(displacementInMeters, Meters);
99  }
100 
101 
107  double Displacement::kilometers() const {
108  return displacement(Kilometers);
109  }
110 
111 
118  void Displacement::setKilometers(double displacementInKilometers) {
119  setDisplacement(displacementInKilometers, Kilometers);
120  }
121 
122 
130  double Displacement::pixels(double pixelsPerMeter) const {
131  return displacement(Meters) * pixelsPerMeter;
132  }
133 
134 
143  void Displacement::setPixels(double displacementInPixels,
144  double pixelsPerMeter) {
145  setDisplacement(displacementInPixels / pixelsPerMeter, Meters);
146  }
147 
148 
154  bool Displacement::isValid() const {
155  return displacement(Meters) != Null;
156  }
157 
158 
167  bool Displacement::operator >(const Displacement &otherDisplacement) const {
168  if(!isValid() || !otherDisplacement.isValid()) {
169  IString msg = "Displacement has not been initialized, you must initialize "
170  "it first before comparing with another displacement using [>]";
172  }
173 
174  return meters() > otherDisplacement.meters();
175  }
176 
177 
186  bool Displacement::operator <(const Displacement &otherDisplacement) const {
187  if(!isValid() || !otherDisplacement.isValid()) {
188  IString msg = "Displacement has not been initialized, you must initialize "
189  "it first before comparing with another displacement using [<]";
191  }
192 
193  return meters() < otherDisplacement.meters();
194  }
195 
196 
203  Displacement Displacement::operator
204  +(const Displacement &displacementToAdd) const {
205  if(!isValid() || !displacementToAdd.isValid()) return Displacement();
206 
207  return Displacement(meters() + displacementToAdd.meters(), Meters);
208  }
209 
210 
218  Displacement Displacement::operator
219  -(const Displacement &displacementToSub) const {
220  if(!isValid() || !displacementToSub.isValid()) return Displacement();
221 
222  Displacement result(meters() - displacementToSub.meters(), Meters);
223  return result;
224  }
225 
226 
234  Displacement Displacement::operator
235  -(const Distance &distanceToSub) const {
236  if(!isValid() || !distanceToSub.isValid()) return Displacement();
237 
238  Displacement result(meters() - distanceToSub.meters(), Meters);
239  return result;
240  }
241 
242 
249  double Displacement::operator /(const Displacement &displacementToDiv) const {
250  if(!isValid() || !displacementToDiv.isValid()) return Null;
251 
252  double result = meters() / displacementToDiv.meters();
253  return result;
254  }
255 
256 
263  Displacement Displacement::operator /(const double &valueToDiv) const {
264  if(!isValid() || IsSpecial(valueToDiv)) return Displacement();
265 
266  Displacement result = Displacement(meters() / valueToDiv, Meters);
267  return result;
268  }
269 
270 
277  Displacement Displacement::operator *(const double &valueToMult) const {
278  if(!isValid() || IsSpecial(valueToMult)) return Displacement();
279 
280  Displacement result = Displacement(meters() * valueToMult, Meters);
281  return result;
282  }
283 
284 
292  Displacement operator *(double mult, Displacement displacement) {
293  Displacement result = displacement * mult;
294  return result;
295  }
296 
297 
303  void Displacement::operator +=(const Displacement &displacementToAdd) {
304  if(!isValid() || !displacementToAdd.isValid())
306  else
307  setDisplacement(meters() + displacementToAdd.meters(), Meters);
308  }
309 
310 
316  void Displacement::operator -=(const Displacement &displacementToSub) {
317  if(!isValid() || !displacementToSub.isValid())
319  else
320  setDisplacement(meters() - displacementToSub.meters(), Meters);
321  }
322 
323 
329  void Displacement::operator -=(const Distance &distanceToSub) {
330  if(!isValid() || !distanceToSub.isValid())
332  else
333  setDisplacement(meters() - distanceToSub.meters(), Meters);
334  }
335 
336 
342  void Displacement::operator /=(const double &valueToDiv) {
343  if(!isValid() || IsSpecial(valueToDiv))
345  else
346  setDisplacement(meters() / valueToDiv, Meters);
347  }
348 
349 
355  void Displacement::operator *=(const double &valueToMult) {
356  if(!isValid() || IsSpecial(valueToMult))
358  else
359  setDisplacement(meters() * valueToMult, Meters);
360  }
361 
362 
371  double Displacement::displacement(Units displacementUnit) const {
372  double displacementInMeters = m_displacementInMeters;
373  double resultingDisplacement = Null;
374 
375  if(m_displacementInMeters == Null) return Null;
376 
377  switch(displacementUnit) {
378  case Meters:
379  resultingDisplacement = displacementInMeters;
380  break;
381 
382  case Kilometers:
383  resultingDisplacement = displacementInMeters / 1000.0;
384  break;
385 
386  case Pixels:
387  IString msg = "Cannot call displacement with pixels, ask for another "
388  "unit";
390  break;
391  }
392 
393  if(resultingDisplacement == Null) {
394  IString msg = "Displacement does not understand the enumerated value [" +
395  IString(displacementUnit) + "] as a unit";
397  }
398 
399  return resultingDisplacement;
400  }
401 
402 
413  void Displacement::setDisplacement(const double &displacement, Units displacementUnit) {
414  double displacementInMeters = Null;
415 
416  if(IsSpecial(displacement)) {
418  return;
419  }
420 
421  switch(displacementUnit) {
422  case Meters:
423  displacementInMeters = displacement;
424  break;
425 
426  case Kilometers:
427  displacementInMeters = displacement * 1000.0;
428  break;
429 
430  case Pixels:
431  IString msg = "Cannot setDisplacement with pixels, must convert to "
432  "another unit first";
434  break;
435  }
436 
437  if(displacementInMeters == Null) {
438  IString msg = "Displacement does not understand the enumerated value [" +
439  IString(displacementUnit) + "] as a unit";
441  }
442 
443  m_displacementInMeters = displacementInMeters;
444  }
445 }
double meters() const
Get the distance in meters.
Definition: Distance.cpp:97
const double Null
Value for an Isis Null pixel.
Definition: SpecialPixel.h:110
The distance is being specified in kilometers.
Definition: Displacement.h:54
void setKilometers(double displacementInKilometers)
Set the displacement in kilometers.
double meters() const
Get the displacement in meters.
bool isValid() const
Test if this displacement has been initialized or not.
void operator*=(const double &valueToMult)
Multiply this displacement by a value and assign the result to ourself.
Angle operator*(double mult, Angle angle)
Multiply this angle by a double and return the resulting angle.
Definition: Angle.cpp:185
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:162
The distance is being specified in meters.
Definition: Displacement.h:52
Distance measurement, usually in meters.
Definition: Distance.h:47
bool operator<(const Displacement &otherDisplacement) const
Compare two displacements with the less than operator.
void setPixels(double distanceInPixels, double pixelsPerMeter=1.0)
Set the displacement in pixels.
double displacement(Units displacementUnit) const
This is a helper method to access displacements in a universal manner with uniform error checking...
The distance is being specified in pixels.
Definition: Displacement.h:56
Units
This is a list of available units to access and store Distances in.
Definition: Displacement.h:50
#define _FILEINFO_
Macro for the filename and line number.
Definition: IException.h:40
bool operator>(const Displacement &otherDisplacement) const
Get the displacement in meters.
bool IsSpecial(const double d)
Returns if the input pixel is special.
Definition: SpecialPixel.h:212
bool isValid() const
Test if this distance has been initialized or not.
Definition: Distance.cpp:204
void operator/=(const double &valueToDiv)
Divide this displacement by a value and assign the result to ourself.
void operator-=(const Displacement &displacementToSub)
Subtract the given displacement from ourself and assign.
Displacement is a signed length, usually in meters.
Definition: Displacement.h:43
Displacement operator*(const double &valueToMult) const
Multiply this displacement by a value (5m * 2 = 10m).
double pixels(double pixelsPerMeter=1.0) const
Get the displacement in pixels using the given conversion ratio.
Isis exception class.
Definition: IException.h:107
Adds specific functionality to C++ strings.
Definition: IString.h:181
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
double m_displacementInMeters
This is the displacement value that this class is encapsulating, always stored in meters...
Definition: Displacement.h:169
void setMeters(double displacementInMeters)
Set the displacement in meters.
double kilometers() const
Get the displacement in kilometers.
void setDisplacement(const double &displacement, Units displacementUnit)
This is a helper method to set displacements in a universal manner with uniform error checking...
double operator/(const Displacement &displacementToDiv) const
Divide another displacement into this displacement (5m / 1m = 5).
void operator+=(const Displacement &displacementToAdd)
Add and assign the given displacement to ourselves.
Displacement()
This initializes the displacement to an invalid state.