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
15namespace Isis {
16
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}
Displacement is a signed length, usually in meters.
@ Meters
The distance is being specified in meters.
Distance measurement, usually in meters.
Definition Distance.h:34
friend Distance operator*(double mult, Distance dist)
Multiply this distance by a value (5m * 2 = 10m).
Definition Distance.cpp:329
void setPixels(double distanceInPixels, double pixelsPerMeter=1.0)
Set the distance in pixels.
Definition Distance.cpp:145
void operator+=(const Distance &distanceToAdd)
Add and assign the given distance to ourselves.
Definition Distance.cpp:340
double solarRadii() const
Get the distance in solar radii (a unit of ~696,265km).
Definition Distance.cpp:155
bool operator<(const Distance &otherDistance) const
Compare two distances with the less than operator.
Definition Distance.cpp:222
void operator-=(const Distance &distanceToSub)
Subtract and assign the given distance from ourself.
Definition Distance.cpp:357
bool isValid() const
Test if this distance has been initialized or not.
Definition Distance.cpp:192
void setSolarRadii(double distanceInSolarRadii)
Set the distance in solar radii.
Definition Distance.cpp:167
double operator/(const Distance &distanceToDiv) const
Divide another distance into this distance (5m / 1m = 5).
Definition Distance.cpp:284
bool operator>(const Distance &otherDistance) const
Compare two distances with the greater than operator.
Definition Distance.cpp:204
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
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
double m_distanceInMeters
This is the distance value that this class is encapsulating, always stored in meters.
Definition Distance.h:159
void setMeters(double distanceInMeters)
Set the distance in meters.
Definition Distance.cpp:96
double kilometers() const
Get the distance in kilometers.
Definition Distance.cpp:106
Displacement operator-(const Distance &distanceToSub) const
Subtract another distance from this distance (1km - 1m = 995m).
Definition Distance.cpp:268
void operator/=(const double &valueToDiv)
Divide this distance by a value and assign the result to ourself.
Definition Distance.cpp:372
Distance operator+(const Distance &distanceToAdd) const
Add another distance to this distance (1km + 1m = 1005m)
Definition Distance.cpp:254
Distance()
This initializes the distance to an invalid state.
Definition Distance.cpp:21
void setKilometers(double distanceInKilometers)
Set the distance in kilometers.
Definition Distance.cpp:118
Units
This is a list of available units to access and store Distances in.
Definition Distance.h:41
@ 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
@ Pixels
The distance is being specified in pixels.
Definition Distance.h:47
@ Kilometers
The distance is being specified in kilometers.
Definition Distance.h:45
@ Meters
The distance is being specified in meters.
Definition Distance.h:43
void operator*=(const double &valueToMult)
Multiply this distance by a value and assign the result to ourself.
Definition Distance.cpp:387
virtual ~Distance()
This will free the memory allocated by this instance of the Distance class.
Definition Distance.cpp:73
double pixels(double pixelsPerMeter=1.0) const
Get the distance in pixels using the given conversion ratio.
Definition Distance.cpp:131
double meters() const
Get the distance in meters.
Definition Distance.cpp:85
QString toString() const
Get a textual representation of this distance.
Definition Distance.cpp:177
Distance & operator=(const Distance &distanceToCopy)
Assign this distance to the value of another distance.
Definition Distance.cpp:239
Isis exception class.
Definition IException.h:91
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition IException.h:146
Adds specific functionality to C++ strings.
Definition IString.h:165
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
const double Null
Value for an Isis Null pixel.
bool IsSpecial(const double d)
Returns if the input pixel is special.
Angle operator*(double mult, Angle angle)
Multiply this angle by a double and return the resulting angle.
Definition Angle.cpp:170