File failed to load: https://isis.astrogeology.usgs.gov/9.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
Area3D.cpp
1
5
6/* SPDX-License-Identifier: CC0-1.0 */
7
8#include "Area3D.h"
9
10#include <algorithm>
11
12#include <QObject>
13#include <QString>
14
15#include "Displacement.h"
16#include "Distance.h"
17#include "IException.h"
18#include "IString.h"
19
20namespace Isis {
27
28
39 Area3D::Area3D(const Displacement &startX, const Displacement &startY,
40 const Displacement &startZ,
41 const Distance &width, const Distance &height,
42 const Distance &depth) {
44 setArea(startX, startY, startZ,
45 startX + width, startY + height, startZ + depth);
46 }
47
48
59 Area3D::Area3D(const Displacement &startX, const Displacement &startY,
60 const Displacement &startZ,
61 const Displacement &endX, const Displacement &endY,
62 const Displacement &endZ) {
64 setArea(startX, startY, startZ, endX, endY, endZ);
65 }
66
67
73 Area3D::Area3D(const Area3D &areaToCopy) {
75
76 if(areaToCopy.m_startX) {
77 m_startX = new Displacement(*areaToCopy.m_startX);
78 }
79
80 if(areaToCopy.m_startY) {
81 m_startY = new Displacement(*areaToCopy.m_startY);
82 }
83
84 if(areaToCopy.m_startZ) {
85 m_startZ = new Displacement(*areaToCopy.m_startZ);
86 }
87
88 if(areaToCopy.m_endX) {
89 m_endX = new Displacement(*areaToCopy.m_endX);
90 }
91
92 if(areaToCopy.m_endY) {
93 m_endY = new Displacement(*areaToCopy.m_endY);
94 }
95
96 if(areaToCopy.m_endZ) {
97 m_endZ = new Displacement(*areaToCopy.m_endZ);
98 }
99 }
100
101
108
109
116 Displacement startX;
117
118 if(m_startX)
119 startX = *m_startX;
120
121 return startX;
122 }
123
124
131 Displacement startY;
132
133 if(m_startY)
134 startY = *m_startY;
135
136 return startY;
137 }
138
139
146 Displacement startZ;
147
148 if(m_startZ)
149 startZ = *m_startZ;
150
151 return startZ;
152 }
153
154
161 return Distance(
162 (getEndX() - getStartX()).meters(),
164 }
165
166
173 return Distance(
174 (getEndY() - getStartY()).meters(),
176 }
177
178
185 return Distance(
186 (getEndZ() - getStartZ()).meters(),
188 }
189
190
197 Displacement endX;
198
199 if(m_endX)
200 endX = *m_endX;
201
202 return endX;
203 }
204
205
212 Displacement endY;
213
214 if(m_endY)
215 endY = *m_endY;
216
217 return endY;
218 }
219
220
227 Displacement endZ;
228
229 if(m_endZ)
230 endZ = *m_endZ;
231
232 return endZ;
233 }
234
235
242 void Area3D::setStartX(const Displacement &startX) {
243 setArea(startX, getStartY(), getStartZ(),
244 getEndX(), getEndY(), getEndZ());
245 }
246
247
254 void Area3D::setStartY(const Displacement &startY) {
255 setArea(getStartX(), startY, getStartZ(),
256 getEndX(), getEndY(), getEndZ());
257 }
258
259
266 void Area3D::setStartZ(const Displacement &startZ) {
267 setArea(getStartX(), getStartY(), startZ,
268 getEndX(), getEndY(), getEndZ());
269 }
270
271
278 void Area3D::moveStartX(const Displacement &startX) {
279 setArea(startX, getStartY(), getStartZ(),
280 getEndX() + (startX - getStartX()), getEndY(), getEndZ());
281 }
282
283
290 void Area3D::moveStartY(const Displacement &startY) {
291 setArea(getStartX(), startY, getStartZ(),
292 getEndX(), getEndY() + (startY - getStartY()), getEndZ());
293 }
294
295
302 void Area3D::moveStartZ(const Displacement &startZ) {
303 setArea(getStartX(), getStartY(), startZ,
304 getEndX(), getEndY(), getEndZ() + (startZ - getStartZ()));
305 }
306
307
313 void Area3D::setWidth(const Distance &width) {
315 getStartX() + width, getEndY(), getEndZ());
316 }
317
318
324 void Area3D::setHeight(const Distance &height) {
326 getEndX(), getStartY() + height, getEndZ());
327 }
328
329
335 void Area3D::setDepth(const Distance &depth) {
337 getEndX(), getEndY(), getStartZ() + depth);
338 }
339
340
347 void Area3D::setEndX(const Displacement &endX) {
349 endX, getEndY(), getEndZ());
350 }
351
352
359 void Area3D::setEndY(const Displacement &endY) {
361 getEndX(), endY, getEndZ());
362 }
363
364
371 void Area3D::setEndZ(const Displacement &endZ) {
373 getEndX(), getEndY(), endZ);
374 }
375
376
383 void Area3D::moveEndX(const Displacement &endX) {
384 setArea(getStartX() + (endX - getEndX()), getStartY(), getStartZ(),
385 endX, getEndY(), getEndZ());
386 }
387
388
395 void Area3D::moveEndY(const Displacement &endY) {
396 setArea(getStartX(), getStartY() + (endY - getEndY()), getStartZ(),
397 getEndX(), endY, getEndZ());
398 }
399
400
407 void Area3D::moveEndZ(const Displacement &endZ) {
408 setArea(getStartX(), getStartY(), getStartZ() + (endZ - getEndZ()),
409 getEndX(), getEndY(), endZ);
410 }
411
412
421 const Distance &width) {
422 setArea(startX, getStartY(), getStartZ(),
423 startX + width, getEndY(), getEndZ());
424 }
425
426
435 const Distance &height) {
436 setArea(getStartX(), startY, getStartZ(),
437 getEndX(), startY + height, getEndZ());
438 }
439
440
449 const Distance &depth) {
450 setArea(getStartX(), getStartY(), startZ,
451 getEndX(), getEndY(), startZ + depth);
452 }
453
454
462 Area3D Area3D::intersect(const Area3D &otherArea) const {
463 Area3D result;
464
465 // Check validity because of comparison operators.
466 if (isValid() && otherArea.isValid()) {
467 Displacement startX(std::max(getStartX(), otherArea.getStartX()));
468 Displacement startY(std::max(getStartY(), otherArea.getStartY()));
469 Displacement startZ(std::max(getStartZ(), otherArea.getStartZ()));
470 Displacement endX(std::min(getEndX(), otherArea.getEndX()));
471 Displacement endY(std::min(getEndY(), otherArea.getEndY()));
472 Displacement endZ(std::min(getEndZ(), otherArea.getEndZ()));
473
474
475 if (startX <= endX && startY <= endY && startZ <= endZ)
476 result = Area3D(startX, startY, startZ, endX, endY, endZ);
477 }
478
479 return result;
480 }
481
482
489 bool Area3D::isValid() const {
490 bool valid = true;
491
492 if(!m_startX)
493 valid = false;
494 else if(!m_startY)
495 valid = false;
496 else if(!m_startZ)
497 valid = false;
498 else if(!m_endX)
499 valid = false;
500 else if(!m_endY)
501 valid = false;
502 else if(!m_endZ)
503 valid = false;
504
505 return valid;
506 }
507
508
517 bool Area3D::operator ==(const Area3D &otherArea) const {
518 return getStartX() == otherArea.getStartX() &&
519 getStartY() == otherArea.getStartY() &&
520 getStartZ() == otherArea.getStartZ() &&
521 getEndX() == otherArea.getEndX() &&
522 getEndY() == otherArea.getEndY() &&
523 getEndZ() == otherArea.getEndZ();
524 }
525
526
535 bool Area3D::operator !=(const Area3D &otherArea) const {
536 return !(*this == otherArea);
537 }
538
539
546 Area3D &Area3D::operator =(const Area3D &areaToCopy) {
548
549 if(areaToCopy.m_startX) {
550 m_startX = new Displacement(*areaToCopy.m_startX);
551 }
552
553 if(areaToCopy.m_startY) {
554 m_startY = new Displacement(*areaToCopy.m_startY);
555 }
556
557 if(areaToCopy.m_startZ) {
558 m_startZ = new Displacement(*areaToCopy.m_startZ);
559 }
560
561 if(areaToCopy.m_endX) {
562 m_endX = new Displacement(*areaToCopy.m_endX);
563 }
564
565 if(areaToCopy.m_endY) {
566 m_endY = new Displacement(*areaToCopy.m_endY);
567 }
568
569 if(areaToCopy.m_endZ) {
570 m_endZ = new Displacement(*areaToCopy.m_endZ);
571 }
572
573 return *this;
574 }
575
576
593 void Area3D::setArea(const Displacement &startX,
594 const Displacement &startY, const Displacement &startZ,
595 const Displacement &endX, const Displacement &endY,
596 const Displacement &endZ) {
597 bool startXValid = startX.isValid();
598 bool endXValid = endX.isValid();
599 bool startYValid = startY.isValid();
600 bool endYValid = endY.isValid();
601 bool startZValid = startZ.isValid();
602 bool endZValid = endZ.isValid();
603
605
606 // Optimized for success.
607 if(startXValid && startYValid && startZValid && endXValid && endYValid &&
608 endZValid && startX <= endX && startY <= endY && startZ <= endZ) {
609 m_startX = new Displacement(startX);
610 m_startY = new Displacement(startY);
611 m_startZ = new Displacement(startZ);
612 m_endX = new Displacement(endX);
613 m_endY = new Displacement(endY);
614 m_endZ = new Displacement(endZ);
615 }
616 else {
617 if(startXValid && endXValid && startX > endX) {
618 QString msg = QObject::tr("Cannot have a 3D area with inverted X coordinates of "
619 "[%1 meters] to [%2 meters]")
620 .arg(startX.meters()).arg(endX.meters());
621 throw IException(IException::Programmer, msg, _FILEINFO_);
622 }
623
624 if(startYValid && endYValid && startY > endY) {
625 QString msg = QObject::tr("Cannot have a 3D area with inverted Y coordinates of "
626 "[%1 meters] to [%2 meters]")
627 .arg(startY.meters()).arg(endY.meters());
628 throw IException(IException::Programmer, msg, _FILEINFO_);
629 }
630
631 if(startZValid && endZValid && startZ > endZ) {
632 QString msg = QObject::tr("Cannot have a 3D area with inverted Z coordinates of "
633 "[%1 meters] to [%2 meters]")
634 .arg(startZ.meters()).arg(endZ.meters());
635 throw IException(IException::Programmer, msg, _FILEINFO_);
636 }
637
638 if(startXValid)
639 m_startX = new Displacement(startX);
640
641 if(startYValid)
642 m_startY = new Displacement(startY);
643
644 if(startZValid)
645 m_startZ = new Displacement(startZ);
646
647 if(endXValid)
648 m_endX = new Displacement(endX);
649
650 if(endYValid)
651 m_endY = new Displacement(endY);
652
653 if(endZValid)
654 m_endZ = new Displacement(endZ);
655 }
656 }
657
658
663 if(m_startX) {
664 delete m_startX;
665 m_startX = NULL;
666 }
667
668 if(m_startY) {
669 delete m_startY;
670 m_startY = NULL;
671 }
672
673 if(m_startZ) {
674 delete m_startZ;
675 m_startZ = NULL;
676 }
677
678 if(m_endX) {
679 delete m_endX;
680 m_endX = NULL;
681 }
682
683 if(m_endY) {
684 delete m_endY;
685 m_endY = NULL;
686 }
687
688 if(m_endZ) {
689 delete m_endZ;
690 m_endZ = NULL;
691 }
692 }
693
694
699 m_startX = NULL;
700 m_startY = NULL;
701 m_startZ = NULL;
702 m_endX = NULL;
703 m_endY = NULL;
704 m_endZ = NULL;
705 }
706}
707
Displacement getStartY() const
Returns the topmost Y position of the 3D area.
Definition Area3D.cpp:130
bool isValid() const
Returns true if all of the positions of the 3D area are valid (i.e.
Definition Area3D.cpp:489
Area3D & operator=(const Area3D &areaToCopy)
Assigns areaToCopy to this.
Definition Area3D.cpp:546
Displacement * m_endX
The rightmost X position. Either NULL or a valid displacement.
Definition Area3D.h:105
void setHeight(const Distance &height)
Changes the height of the 3D area.
Definition Area3D.cpp:324
void setStartY(const Displacement &startY)
Sets the topmost Y position.
Definition Area3D.cpp:254
void setZDimension(const Displacement &startZ, const Distance &depth)
Sets the Z dimension of the 3D area.
Definition Area3D.cpp:448
void setEndY(const Displacement &endY)
Sets the bottommost Y position.
Definition Area3D.cpp:359
Displacement getEndX() const
Returns the rightmost X position of the 3D area.
Definition Area3D.cpp:196
void setEndZ(const Displacement &endZ)
Sets the backmost Z position.
Definition Area3D.cpp:371
void setWidth(const Distance &width)
Changes the width of the 3D area.
Definition Area3D.cpp:313
Distance getWidth() const
Returns the width (in the X dimension) of the 3D area.
Definition Area3D.cpp:160
Displacement * m_startX
The leftmost X position. Either NULL or a valid displacement.
Definition Area3D.h:99
virtual ~Area3D()
The destructor frees allocated memory.
Definition Area3D.cpp:105
void setYDimension(const Displacement &startY, const Distance &height)
Sets the Y dimension of the 3D area.
Definition Area3D.cpp:434
Displacement * m_startY
The topmost Y position. Either NULL or a valid displacement.
Definition Area3D.h:101
Displacement * m_startZ
The frontmost Z position. Either NULL or a valid displacement.
Definition Area3D.h:103
bool operator!=(const Area3D &otherArea) const
Compares two areas with the != operator.
Definition Area3D.cpp:535
Area3D intersect(const Area3D &otherArea) const
Returns the intersection of this 3D area with another 3D area.
Definition Area3D.cpp:462
void moveEndY(const Displacement &endY)
Moves the bottommost Y position of the 3D area.
Definition Area3D.cpp:395
virtual void setArea(const Displacement &startX, const Displacement &startY, const Displacement &startZ, const Displacement &endX, const Displacement &endY, const Displacement &endZ)
Sets the area.
Definition Area3D.cpp:593
Distance getDepth() const
Returns the depth (in the Z dimension) of the 3D area.
Definition Area3D.cpp:184
void moveStartX(const Displacement &startX)
Moves the leftmost X position of the 3D area.
Definition Area3D.cpp:278
void setDepth(const Distance &depth)
Changes the depth of the 3D area.
Definition Area3D.cpp:335
void moveStartZ(const Displacement &startZ)
Moves the frontmost Z position of the 3D area.
Definition Area3D.cpp:302
void moveEndZ(const Displacement &endZ)
Moves the backmost Z position of the 3D area.
Definition Area3D.cpp:407
void moveEndX(const Displacement &endX)
Moves the rightmost X position of the 3D area.
Definition Area3D.cpp:383
Displacement * m_endZ
The backmost Z position. Either NULL or a valid displacement.
Definition Area3D.h:109
Displacement getStartZ() const
Returns the frontmost Z position of the 3D area.
Definition Area3D.cpp:145
void moveStartY(const Displacement &startY)
Moves the topmost Y position of the 3D area.
Definition Area3D.cpp:290
bool operator==(const Area3D &otherArea) const
Compares two areas with the == operator.
Definition Area3D.cpp:517
void setStartX(const Displacement &startX)
Sets the leftmost X position.
Definition Area3D.cpp:242
Distance getHeight() const
Returns the height (in the Y dimension) of the 3D area.
Definition Area3D.cpp:172
void setXDimension(const Displacement &startX, const Distance &width)
Sets the X dimension of the 3D area.
Definition Area3D.cpp:420
void setStartZ(const Displacement &startZ)
Sets the frontmost Z position.
Definition Area3D.cpp:266
Displacement getEndZ() const
Returns the backmost Z position of the 3D area.
Definition Area3D.cpp:226
void deleteTheData()
Frees all allocated memory used by this 3D area.
Definition Area3D.cpp:662
Displacement getEndY() const
Returns the bottommost Y position of the 3D area.
Definition Area3D.cpp:211
void nullTheData()
Nulls all of the members used by this 3D area.
Definition Area3D.cpp:698
Displacement getStartX() const
Returns the leftmost X position of the 3D area.
Definition Area3D.cpp:115
void setEndX(const Displacement &endX)
Sets the rightmost X position.
Definition Area3D.cpp:347
Displacement * m_endY
The bottommost Y position. Either NULL or a valid displacement.
Definition Area3D.h:107
Area3D()
The empty constructor creates an invalid 3D area.
Definition Area3D.cpp:24
Displacement is a signed length, usually in meters.
bool isValid() const
Test if this displacement has been initialized or not.
double meters() const
Get the displacement in meters.
Distance measurement, usually in meters.
Definition Distance.h:34
@ Meters
The distance is being specified in meters.
Definition Distance.h:43
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
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16