USGS

Isis 3.0 Object Programmers' Reference

Home

Area3D.cpp
Go to the documentation of this file.
1 
24 #include "Area3D.h"
25 
26 #include <algorithm>
27 
28 #include <QString>
29 
30 #include "Displacement.h"
31 #include "Distance.h"
32 #include "IException.h"
33 #include "IString.h"
34 
35 namespace Isis {
40  nullTheData();
41  }
42 
43 
54  Area3D::Area3D(const Displacement &startX, const Displacement &startY,
55  const Displacement &startZ,
56  const Distance &width, const Distance &height,
57  const Distance &depth) {
58  nullTheData();
59  setArea(startX, startY, startZ,
60  startX + width, startY + height, startZ + depth);
61  }
62 
63 
74  Area3D::Area3D(const Displacement &startX, const Displacement &startY,
75  const Displacement &startZ,
76  const Displacement &endX, const Displacement &endY,
77  const Displacement &endZ) {
78  nullTheData();
79  setArea(startX, startY, startZ, endX, endY, endZ);
80  }
81 
82 
88  Area3D::Area3D(const Area3D &areaToCopy) {
89  nullTheData();
90 
91  if(areaToCopy.m_startX) {
92  m_startX = new Displacement(*areaToCopy.m_startX);
93  }
94 
95  if(areaToCopy.m_startY) {
96  m_startY = new Displacement(*areaToCopy.m_startY);
97  }
98 
99  if(areaToCopy.m_startZ) {
100  m_startZ = new Displacement(*areaToCopy.m_startZ);
101  }
102 
103  if(areaToCopy.m_endX) {
104  m_endX = new Displacement(*areaToCopy.m_endX);
105  }
106 
107  if(areaToCopy.m_endY) {
108  m_endY = new Displacement(*areaToCopy.m_endY);
109  }
110 
111  if(areaToCopy.m_endZ) {
112  m_endZ = new Displacement(*areaToCopy.m_endZ);
113  }
114  }
115 
116 
121  deleteTheData();
122  }
123 
124 
129  Displacement startX;
130 
131  if(m_startX)
132  startX = *m_startX;
133 
134  return startX;
135  }
136 
137 
142  Displacement startY;
143 
144  if(m_startY)
145  startY = *m_startY;
146 
147  return startY;
148  }
149 
150 
155  Displacement startZ;
156 
157  if(m_startZ)
158  startZ = *m_startZ;
159 
160  return startZ;
161  }
162 
163 
168  return Distance(
169  (getEndX() - getStartX()).meters(),
171  }
172 
173 
178  return Distance(
179  (getEndY() - getStartY()).meters(),
181  }
182 
183 
188  return Distance(
189  (getEndZ() - getStartZ()).meters(),
191  }
192 
193 
198  Displacement endX;
199 
200  if(m_endX)
201  endX = *m_endX;
202 
203  return endX;
204  }
205 
206 
211  Displacement endY;
212 
213  if(m_endY)
214  endY = *m_endY;
215 
216  return endY;
217  }
218 
219 
224  Displacement endZ;
225 
226  if(m_endZ)
227  endZ = *m_endZ;
228 
229  return endZ;
230  }
231 
232 
239  void Area3D::setStartX(const Displacement &startX) {
240  setArea(startX, getStartY(), getStartZ(),
241  getEndX(), getEndY(), getEndZ());
242  }
243 
244 
251  void Area3D::setStartY(const Displacement &startY) {
252  setArea(getStartX(), startY, getStartZ(),
253  getEndX(), getEndY(), getEndZ());
254  }
255 
256 
263  void Area3D::setStartZ(const Displacement &startZ) {
264  setArea(getStartX(), getStartY(), startZ,
265  getEndX(), getEndY(), getEndZ());
266  }
267 
268 
275  void Area3D::moveStartX(const Displacement &startX) {
276  setArea(startX, getStartY(), getStartZ(),
277  getEndX() + (startX - getStartX()), getEndY(), getEndZ());
278  }
279 
280 
287  void Area3D::moveStartY(const Displacement &startY) {
288  setArea(getStartX(), startY, getStartZ(),
289  getEndX(), getEndY() + (startY - getStartY()), getEndZ());
290  }
291 
292 
299  void Area3D::moveStartZ(const Displacement &startZ) {
300  setArea(getStartX(), getStartY(), startZ,
301  getEndX(), getEndY(), getEndZ() + (startZ - getStartZ()));
302  }
303 
304 
310  void Area3D::setWidth(const Distance &width) {
312  getStartX() + width, getEndY(), getEndZ());
313  }
314 
315 
321  void Area3D::setHeight(const Distance &height) {
323  getEndX(), getStartY() + height, getEndZ());
324  }
325 
326 
332  void Area3D::setDepth(const Distance &depth) {
334  getEndX(), getEndY(), getStartZ() + depth);
335  }
336 
337 
344  void Area3D::setEndX(const Displacement &endX) {
346  endX, getEndY(), getEndZ());
347  }
348 
349 
356  void Area3D::setEndY(const Displacement &endY) {
358  getEndX(), endY, getEndZ());
359  }
360 
361 
368  void Area3D::setEndZ(const Displacement &endZ) {
370  getEndX(), getEndY(), endZ);
371  }
372 
373 
380  void Area3D::moveEndX(const Displacement &endX) {
381  setArea(getStartX() + (endX - getEndX()), getStartY(), getStartZ(),
382  endX, getEndY(), getEndZ());
383  }
384 
385 
392  void Area3D::moveEndY(const Displacement &endY) {
393  setArea(getStartX(), getStartY() + (endY - getEndY()), getStartZ(),
394  getEndX(), endY, getEndZ());
395  }
396 
397 
404  void Area3D::moveEndZ(const Displacement &endZ) {
405  setArea(getStartX(), getStartY(), getStartZ() + (endZ - getEndZ()),
406  getEndX(), getEndY(), endZ);
407  }
408 
409 
418  const Distance &width) {
419  setArea(startX, getStartY(), getStartZ(),
420  startX + width, getEndY(), getEndZ());
421  }
422 
423 
432  const Distance &height) {
433  setArea(getStartX(), startY, getStartZ(),
434  getEndX(), startY + height, getEndZ());
435  }
436 
437 
446  const Distance &depth) {
447  setArea(getStartX(), getStartY(), startZ,
448  getEndX(), getEndY(), startZ + depth);
449  }
450 
451 
459  Area3D Area3D::intersect(const Area3D &otherArea) const {
460  Area3D result;
461 
462  // Check validity because of comparison operators.
463  if (isValid() && otherArea.isValid()) {
464  Displacement startX(std::max(getStartX(), otherArea.getStartX()));
465  Displacement startY(std::max(getStartY(), otherArea.getStartY()));
466  Displacement startZ(std::max(getStartZ(), otherArea.getStartZ()));
467  Displacement endX(std::min(getEndX(), otherArea.getEndX()));
468  Displacement endY(std::min(getEndY(), otherArea.getEndY()));
469  Displacement endZ(std::min(getEndZ(), otherArea.getEndZ()));
470 
471 
472  if (startX <= endX && startY <= endY && startZ <= endZ)
473  result = Area3D(startX, startY, startZ, endX, endY, endZ);
474  }
475 
476  return result;
477  }
478 
479 
484  bool Area3D::isValid() const {
485  bool valid = true;
486 
487  if(!m_startX)
488  valid = false;
489  else if(!m_startY)
490  valid = false;
491  else if(!m_startZ)
492  valid = false;
493  else if(!m_endX)
494  valid = false;
495  else if(!m_endY)
496  valid = false;
497  else if(!m_endZ)
498  valid = false;
499 
500  return valid;
501  }
502 
503 
512  bool Area3D::operator ==(const Area3D &otherArea) const {
513  return getStartX() == otherArea.getStartX() &&
514  getStartY() == otherArea.getStartY() &&
515  getStartZ() == otherArea.getStartZ() &&
516  getEndX() == otherArea.getEndX() &&
517  getEndY() == otherArea.getEndY() &&
518  getEndZ() == otherArea.getEndZ();
519  }
520 
521 
530  bool Area3D::operator !=(const Area3D &otherArea) const {
531  return !(*this == otherArea);
532  }
533 
534 
541  Area3D &Area3D::operator =(const Area3D &areaToCopy) {
542  deleteTheData();
543 
544  if(areaToCopy.m_startX) {
545  m_startX = new Displacement(*areaToCopy.m_startX);
546  }
547 
548  if(areaToCopy.m_startY) {
549  m_startY = new Displacement(*areaToCopy.m_startY);
550  }
551 
552  if(areaToCopy.m_startZ) {
553  m_startZ = new Displacement(*areaToCopy.m_startZ);
554  }
555 
556  if(areaToCopy.m_endX) {
557  m_endX = new Displacement(*areaToCopy.m_endX);
558  }
559 
560  if(areaToCopy.m_endY) {
561  m_endY = new Displacement(*areaToCopy.m_endY);
562  }
563 
564  if(areaToCopy.m_endZ) {
565  m_endZ = new Displacement(*areaToCopy.m_endZ);
566  }
567 
568  return *this;
569  }
570 
571 
588  void Area3D::setArea(const Displacement &startX,
589  const Displacement &startY, const Displacement &startZ,
590  const Displacement &endX, const Displacement &endY,
591  const Displacement &endZ) {
592  bool startXValid = startX.isValid();
593  bool endXValid = endX.isValid();
594  bool startYValid = startY.isValid();
595  bool endYValid = endY.isValid();
596  bool startZValid = startZ.isValid();
597  bool endZValid = endZ.isValid();
598 
599  deleteTheData();
600 
601  // Optimized for success.
602  if(startXValid && startYValid && startZValid && endXValid && endYValid &&
603  endZValid && startX <= endX && startY <= endY && startZ <= endZ) {
604  m_startX = new Displacement(startX);
605  m_startY = new Displacement(startY);
606  m_startZ = new Displacement(startZ);
607  m_endX = new Displacement(endX);
608  m_endY = new Displacement(endY);
609  m_endZ = new Displacement(endZ);
610  }
611  else {
612  if(startXValid && endXValid && startX > endX) {
613  QString msg = QObject::tr("Cannot have a 3D area with inverted X coordinates of "
614  "[%1 meters] to [%2 meters]")
615  .arg(startX.meters()).arg(endX.meters());
617  }
618 
619  if(startYValid && endYValid && startY > endY) {
620  QString msg = QObject::tr("Cannot have a 3D area with inverted Y coordinates of "
621  "[%1 meters] to [%2 meters]")
622  .arg(startY.meters()).arg(endY.meters());
624  }
625 
626  if(startZValid && endZValid && startZ > endZ) {
627  QString msg = QObject::tr("Cannot have a 3D area with inverted Z coordinates of "
628  "[%1 meters] to [%2 meters]")
629  .arg(startZ.meters()).arg(endZ.meters());
631  }
632 
633  if(startXValid)
634  m_startX = new Displacement(startX);
635 
636  if(startYValid)
637  m_startY = new Displacement(startY);
638 
639  if(startZValid)
640  m_startZ = new Displacement(startZ);
641 
642  if(endXValid)
643  m_endX = new Displacement(endX);
644 
645  if(endYValid)
646  m_endY = new Displacement(endY);
647 
648  if(endZValid)
649  m_endZ = new Displacement(endZ);
650  }
651  }
652 
653 
658  if(m_startX) {
659  delete m_startX;
660  m_startX = NULL;
661  }
662 
663  if(m_startY) {
664  delete m_startY;
665  m_startY = NULL;
666  }
667 
668  if(m_startZ) {
669  delete m_startZ;
670  m_startZ = NULL;
671  }
672 
673  if(m_endX) {
674  delete m_endX;
675  m_endX = NULL;
676  }
677 
678  if(m_endY) {
679  delete m_endY;
680  m_endY = NULL;
681  }
682 
683  if(m_endZ) {
684  delete m_endZ;
685  m_endZ = NULL;
686  }
687  }
688 
689 
694  m_startX = NULL;
695  m_startY = NULL;
696  m_startZ = NULL;
697  m_endX = NULL;
698  m_endY = NULL;
699  m_endZ = NULL;
700  }
701 }
702