File failed to load: https://isis.astrogeology.usgs.gov/6.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
Distance.cpp
1 
6 /* SPDX-License-Identifier: CC0-1.0 */
7 
8 #include "Distance.h"
9 
10 #include "Displacement.h"
11 #include "IException.h"
12 #include "IString.h"
13 #include "SpecialPixel.h"
14 
15 namespace Isis {
16 
23  }
24 
25 
36  Distance::Distance(double distance, Units distanceUnit) {
37  if(distanceUnit == Pixels)
38  distanceUnit = Meters;
39 
40  setDistance(distance, distanceUnit);
41  }
42 
43 
52  Distance::Distance(double distanceInPixels, double pixelsPerMeter) {
53  setDistance(distanceInPixels / pixelsPerMeter, Meters);
54  }
55 
56 
64  Distance::Distance(const Distance &distanceToCopy) {
65  // Use meters because it is the stored format, no precision loss
66  setDistance(distanceToCopy.meters(), Meters);
67  }
68 
69 
74  // This will help debug memory problems, better to reset to obviously bad
75  // values in case we're used after we're deleted.
77  }
78 
79 
85  double Distance::meters() const {
86  return distance(Meters);
87  }
88 
89 
96  void Distance::setMeters(double distanceInMeters) {
97  setDistance(distanceInMeters, Meters);
98  }
99 
100 
106  double Distance::kilometers() const {
107  return distance(Kilometers);
108  }
109 
110 
118  void Distance::setKilometers(double distanceInKilometers) {
119  setDistance(distanceInKilometers, Kilometers);
120  }
121 
122 
131  double Distance::pixels(double pixelsPerMeter) const {
132  return distance(Meters) * pixelsPerMeter;
133  }
134 
135 
145  void Distance::setPixels(double distanceInPixels, double pixelsPerMeter) {
146  setDistance(distanceInPixels / pixelsPerMeter, Meters);
147  }
148 
149 
155  double Distance::solarRadii() const {
156  return distance(SolarRadii);
157  }
158 
159 
167  void Distance::setSolarRadii(double distanceInSolarRadii) {
168  setDistance(distanceInSolarRadii, SolarRadii);
169  }
170 
171 
177  QString Distance::toString() const {
178  QString string;
179 
180  if (isValid())
181  string = Isis::toString(meters()) + " meters";
182 
183  return string;
184  }
185 
186 
192  bool Distance::isValid() const {
193  return distance(Meters) != Null;
194  }
195 
196 
204  bool Distance::operator >(const Distance &otherDistance) const {
205  if(!isValid() || !otherDistance.isValid()) {
206  IString msg = "Distance has not been initialized, you must initialize "
207  "it first before comparing with another distance using [>]";
208  throw IException(IException::Programmer, msg, _FILEINFO_);
209  }
210 
211  return meters() > otherDistance.meters();
212  }
213 
214 
222  bool Distance::operator <(const Distance &otherDistance) const {
223  if(!isValid() || !otherDistance.isValid()) {
224  IString msg = "Distance has not been initialized, you must initialize "
225  "it first before comparing with another distance using [<]";
226  throw IException(IException::Programmer, msg, _FILEINFO_);
227  }
228 
229  return meters() < otherDistance.meters();
230  }
231 
232 
239  Distance &Distance::operator =(const Distance &distanceToCopy) {
240  if(this == &distanceToCopy) return *this;
241 
242  setDistance(distanceToCopy.meters(), Meters);
243 
244  return *this;
245  }
246 
247 
254  Distance Distance::operator +(const Distance &distanceToAdd) const {
255  if(!isValid() || !distanceToAdd.isValid()) return Distance();
256 
257  return Distance(meters() + distanceToAdd.meters(), Meters);
258  }
259 
260 
268  Displacement Distance::operator -(const Distance &distanceToSub) const {
269  if(!isValid() || !distanceToSub.isValid()) return Displacement();
270 
271  Displacement result(meters() - distanceToSub.meters(),
273 
274  return result;
275  }
276 
277 
284  double Distance::operator /(const Distance &distanceToDiv) const {
285  if(!isValid() || !distanceToDiv.isValid()) return Null;
286 
287  double result = meters() / distanceToDiv.meters();
288  return result;
289  }
290 
291 
298  Distance Distance::operator /(const double &valueToDiv) const {
299  if(!isValid() || IsSpecial(valueToDiv)) return Distance();
300 
301  Distance result = Distance(meters() / valueToDiv, Meters);
302 
303  return result;
304  }
305 
306 
313  Distance Distance::operator *(const double &valueToMult) const {
314  if(!isValid() || IsSpecial(valueToMult)) return Distance();
315 
316  Distance result = Distance(meters() * valueToMult, Meters);
317 
318  return result;
319  }
320 
321 
329  Distance operator *(double mult, Distance dist) {
330  Distance result = dist * mult;
331  return result;
332  }
333 
334 
340  void Distance::operator +=(const Distance &distanceToAdd) {
341  if(!isValid() || !distanceToAdd.isValid()) {
343  }
344  else {
345  setDistance(meters() + distanceToAdd.meters(), Meters);
346  }
347  }
348 
349 
357  void Distance::operator -=(const Distance &distanceToSub) {
358  if(!isValid() || !distanceToSub.isValid()) {
360  }
361  else {
362  setDistance(meters() - distanceToSub.meters(), Meters);
363  }
364  }
365 
366 
372  void Distance::operator /=(const double &valueToDiv) {
373  if(!isValid() || IsSpecial(valueToDiv)) {
375  }
376  else {
377  setDistance(meters() / valueToDiv, Meters);
378  }
379  }
380 
381 
387  void Distance::operator *=(const double &valueToMult) {
388  if(!isValid() || IsSpecial(valueToMult)) {
390  }
391  else {
392  setDistance(meters() * valueToMult, Meters);
393  }
394  }
395 
396 
405  double Distance::distance(Units distanceUnit) const {
406  double distanceInMeters = m_distanceInMeters;
407  double resultingDistance = Null;
408 
409  if(m_distanceInMeters == Null) return Null;
410 
411  switch(distanceUnit) {
412  case Meters:
413  resultingDistance = distanceInMeters;
414  break;
415 
416  case Kilometers:
417  resultingDistance = distanceInMeters / 1000.0;
418  break;
419 
420  case Pixels: {
421  IString msg = "Cannot call distance() with pixels, ask for another "
422  "unit";
423  throw IException(IException::Programmer, msg, _FILEINFO_);
424  break;
425  }
426 
427  case SolarRadii:
428  resultingDistance = distanceInMeters / 6.9599e8;
429  break;
430  }
431 
432  if(resultingDistance == Null) {
433  IString msg = "Distance does not understand the enumerated value [" +
434  IString(distanceUnit) + "] as a unit";
435  throw IException(IException::Programmer, msg, _FILEINFO_);
436  }
437 
438  return resultingDistance;
439  }
440 
441 
452  void Distance::setDistance(const double &distance, Units distanceUnit) {
453  double distanceInMeters = Null;
454 
455  if(IsSpecial(distance)) {
457  return;
458  }
459 
460  switch(distanceUnit) {
461  case Meters:
462  distanceInMeters = distance;
463  break;
464 
465  case Kilometers:
466  distanceInMeters = distance * 1000.0;
467  break;
468 
469  case Pixels: {
470  IString msg = "Cannot setDistance with pixels, must convert to another "
471  "unit first";
472  throw IException(IException::Programmer, msg, _FILEINFO_);
473  break;
474  }
475 
476  case SolarRadii:
477  distanceInMeters = distance * 6.9599e8;
478  break;
479  }
480 
481  if(distanceInMeters == Null) {
482  IString msg = "Distance does not understand the enumerated value [" +
483  IString(distanceUnit) + "] as a unit";
484  throw IException(IException::Programmer, msg, _FILEINFO_);
485  }
486 
487  if (distanceInMeters < 0.0) {
488  IString msg = "Negative distances are not supported, the value [" +
489  IString(distanceInMeters) + " meters] cannot be stored in the Distance "
490  "class";
491  throw IException(IException::Programmer, msg, _FILEINFO_);
492  }
493 
494  m_distanceInMeters = distanceInMeters;
495  }
496 }
Isis::Distance::kilometers
double kilometers() const
Get the distance in kilometers.
Definition: Distance.cpp:106
Isis::Distance::setPixels
void setPixels(double distanceInPixels, double pixelsPerMeter=1.0)
Set the distance in pixels.
Definition: Distance.cpp:145
Isis::Distance::operator>
bool operator>(const Distance &otherDistance) const
Compare two distances with the greater than operator.
Definition: Distance.cpp:204
Isis::Displacement::Meters
@ Meters
The distance is being specified in meters.
Definition: Displacement.h:40
Isis::Distance::Pixels
@ Pixels
The distance is being specified in pixels.
Definition: Distance.h:47
Isis::Distance::operator<
bool operator<(const Distance &otherDistance) const
Compare two distances with the less than operator.
Definition: Distance.cpp:222
Isis::operator*
Angle operator*(double mult, Angle angle)
Multiply this angle by a double and return the resulting angle.
Definition: Angle.cpp:170
Isis::Distance::operator=
Distance & operator=(const Distance &distanceToCopy)
Assign this distance to the value of another distance.
Definition: Distance.cpp:239
Isis::Distance::setKilometers
void setKilometers(double distanceInKilometers)
Set the distance in kilometers.
Definition: Distance.cpp:118
Isis::Distance::solarRadii
double solarRadii() const
Get the distance in solar radii (a unit of ~696,265km).
Definition: Distance.cpp:155
Isis::Distance::Units
Units
This is a list of available units to access and store Distances in.
Definition: Distance.h:41
Isis::Distance::SolarRadii
@ SolarRadii
"Solar radius is a unit of distance used to express the size of stars in astronomy equal to the curre...
Definition: Distance.h:59
Isis::toString
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition: IString.cpp:211
Isis::IsSpecial
bool IsSpecial(const double d)
Returns if the input pixel is special.
Definition: SpecialPixel.h:197
Isis::Distance::setMeters
void setMeters(double distanceInMeters)
Set the distance in meters.
Definition: Distance.cpp:96
Isis::Distance
Distance measurement, usually in meters.
Definition: Distance.h:34
Isis::Distance::Kilometers
@ Kilometers
The distance is being specified in kilometers.
Definition: Distance.h:45
Isis::Displacement
Displacement is a signed length, usually in meters.
Definition: Displacement.h:31
Isis::Distance::setSolarRadii
void setSolarRadii(double distanceInSolarRadii)
Set the distance in solar radii.
Definition: Distance.cpp:167
Isis::Distance::Meters
@ Meters
The distance is being specified in meters.
Definition: Distance.h:43
Isis::Distance::~Distance
virtual ~Distance()
This will free the memory allocated by this instance of the Distance class.
Definition: Distance.cpp:73
Isis::Distance::toString
QString toString() const
Get a textual representation of this distance.
Definition: Distance.cpp:177
Isis::Distance::isValid
bool isValid() const
Test if this distance has been initialized or not.
Definition: Distance.cpp:192
Isis::Distance::operator-
Displacement operator-(const Distance &distanceToSub) const
Subtract another distance from this distance (1km - 1m = 995m).
Definition: Distance.cpp:268
Isis::Distance::distance
virtual double distance(Units distanceUnit) const
This is a helper method to access distances in a universal manner with uniform error checking.
Definition: Distance.cpp:405
Isis::IException
Isis exception class.
Definition: IException.h:91
Isis::Null
const double Null
Value for an Isis Null pixel.
Definition: SpecialPixel.h:95
Isis::Distance::Distance
Distance()
This initializes the distance to an invalid state.
Definition: Distance.cpp:21
Isis::Distance::operator/=
void operator/=(const double &valueToDiv)
Divide this distance by a value and assign the result to ourself.
Definition: Distance.cpp:372
Isis::Distance::setDistance
virtual void setDistance(const double &distance, Units distanceUnit)
This is a helper method to set distances in a universal manner with uniform error checking.
Definition: Distance.cpp:452
Isis::IException::Programmer
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:146
Isis::Distance::operator+=
void operator+=(const Distance &distanceToAdd)
Add and assign the given distance to ourselves.
Definition: Distance.cpp:340
Isis::Distance::operator*=
void operator*=(const double &valueToMult)
Multiply this distance by a value and assign the result to ourself.
Definition: Distance.cpp:387
Isis::Distance::operator-=
void operator-=(const Distance &distanceToSub)
Subtract and assign the given distance from ourself.
Definition: Distance.cpp:357
Isis::Distance::meters
double meters() const
Get the distance in meters.
Definition: Distance.cpp:85
Isis::Distance::operator+
Distance operator+(const Distance &distanceToAdd) const
Add another distance to this distance (1km + 1m = 1005m)
Definition: Distance.cpp:254
Isis::IString
Adds specific functionality to C++ strings.
Definition: IString.h:165
Isis::Distance::m_distanceInMeters
double m_distanceInMeters
This is the distance value that this class is encapsulating, always stored in meters.
Definition: Distance.h:159
Isis::Distance::operator*
Distance operator*(const double &valueToMult) const
Multiply this distance by a value (5m * 2 = 10m).
Definition: Distance.cpp:313
Isis::Distance::pixels
double pixels(double pixelsPerMeter=1.0) const
Get the distance in pixels using the given conversion ratio.
Definition: Distance.cpp:131
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16
Isis::Distance::operator/
double operator/(const Distance &distanceToDiv) const
Divide another distance into this distance (5m / 1m = 5).
Definition: Distance.cpp:284

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the USGS Astrogeology Discussion Board
To report a bug, or suggest a feature go to: ISIS Github
File Modified: 07/13/2023 15:16:24