USGS

Isis 3.0 Object Programmers' Reference

Home

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 }