Commit a72a502b68b38318bcf4bfe7fec38b33c95c4411

Authored by Andreas Specovius
Committed by Jürgen Knödlseder
1 parent 644a7dd4

Implemented contains() and overlaps() for GSkyRegionCircle.

Showing 1 changed file with 65 additions and 9 deletions
src/sky/GSkyRegionRect.cpp
... ... @@ -28,6 +28,7 @@
28 28 #ifdef HAVE_CONFIG_H
29 29 #include <config.h>
30 30 #endif
  31 +#include "GSkyRegionCircle.hpp"
31 32 #include "GSkyRegionRect.hpp"
32 33 #include "GTools.hpp"
33 34  
... ... @@ -588,13 +589,41 @@ bool GSkyRegionRect::contains(const GSkyDir&amp; dir) const
588 589 bool GSkyRegionRect::contains(const GSkyRegion& reg) const
589 590 {
590 591 // Initialise return value
591   - bool fully_inside = false;
  592 + bool is_fully_inside = false;
592 593  
593   - throw GException::feature_not_implemented(G_CONTAINS,
594   - "Cannot compare Rect region type yet");
  594 + // If other region is circle use a simple way to calculate
  595 + if (reg.type() == "Circle") {
  596 +
  597 + // Create circular region from reg
  598 + const GSkyRegionCircle* regcirc =
  599 + dynamic_cast<const GSkyRegionCircle*>(&reg);
  600 +
  601 + // Transform circle center to local coordinate system
  602 + GSkyDir local_centre = transform_to_local(regcirc->centre());
  603 +
  604 + // Get circle radius
  605 + const double circ_rad = regcirc->radius();
  606 +
  607 + // Check extension of circle along declination axis
  608 + if ((std::abs(local_centre.dec_deg()) + circ_rad) <= m_halfheight) {
  609 +
  610 + // Check extension of circle along right ascension axis
  611 + if ((std::abs(local_centre.ra_deg()) + circ_rad) <= m_halfwidth) {
  612 +
  613 + // Circle is fully contained in this rectangle
  614 + is_fully_inside = true;
  615 + }
  616 + }
  617 + } // Region was of type "Circle"
  618 +
  619 + // ... otherwise throw an exception
  620 + else {
  621 + throw GException::feature_not_implemented(G_CONTAINS,
  622 + "Cannot compare rectangular region with other than circle yet");
  623 + }
595 624  
596 625 // Return value
597   - return fully_inside;
  626 + return is_fully_inside;
598 627 }
599 628  
600 629  
... ... @@ -608,15 +637,42 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const
608 637 ***************************************************************************/
609 638 bool GSkyRegionRect::overlaps(const GSkyRegion& reg) const
610 639 {
611   -
612 640 // Initialise return value
613   - bool overlap = false;
  641 + bool is_overlapping = false;
614 642  
615   - throw GException::feature_not_implemented(G_OVERLAPS,
616   - "Cannot compare Rect region type yet");
  643 + // If other region is circle use a simple way to calculate
  644 + if (reg.type() == "Circle") {
  645 +
  646 + // Create circular region from reg
  647 + const GSkyRegionCircle* regcirc =
  648 + dynamic_cast<const GSkyRegionCircle*>(&reg);
  649 +
  650 + // Transform circle center to local coordinate system
  651 + GSkyDir local_centre = transform_to_local(regcirc->centre());
  652 +
  653 + // Get circle radius
  654 + const double circ_rad = regcirc->radius();
  655 +
  656 + // Check extension of circle along declination axis
  657 + if (std::abs(local_centre.dec_deg()) <= (m_halfheight + circ_rad)) {
  658 +
  659 + // Check extension of circle along right ascension axis
  660 + if (std::abs(local_centre.ra_deg()) <= (m_halfwidth + circ_rad)) {
  661 +
  662 + // Circle is fully contained in this rectangle
  663 + is_overlapping = true;
  664 + }
  665 + }
  666 + } // Region was of type "Circle"
  667 +
  668 + // ... otherwise throw an exception
  669 + else {
  670 + throw GException::feature_not_implemented(G_OVERLAPS,
  671 + "Cannot compare rectangular region with other than circle yet");
  672 + }
617 673  
618 674 // Return value
619   - return overlap;
  675 + return is_overlapping;
620 676 }
621 677  
622 678  
... ...