diff --git a/include/GSkyRegionRing.hpp b/include/GSkyRegionRing.hpp index 7a0528f..0d36478 100644 --- a/include/GSkyRegionRing.hpp +++ b/include/GSkyRegionRing.hpp @@ -94,9 +94,10 @@ protected: void compute_solid_angle(void); // Protected members - GSkyDir m_centre; //!< Centre or reference point of the region - double m_radius1; //!< Radius of inner ring the region [deg] - double m_radius2; //!< Radius of outer ring the region [deg] + GSkyDir m_centre; //!< Centre or reference point of the region + double m_radius1; //!< Radius of inner ring the region [deg] + double m_radius2; //!< Radius of outer ring the region [deg] + }; diff --git a/src/sky/GSkyRegionCircle.cpp b/src/sky/GSkyRegionCircle.cpp index d5bd2d3..57e154a 100644 --- a/src/sky/GSkyRegionCircle.cpp +++ b/src/sky/GSkyRegionCircle.cpp @@ -29,6 +29,7 @@ #include #endif #include "GSkyRegionCircle.hpp" +#include "GSkyRegionRing.hpp" #include "GTools.hpp" /* __ Method name definitions ____________________________________________ */ @@ -522,6 +523,28 @@ bool GSkyRegionCircle::overlaps(const GSkyRegion& reg) const } + // If other region is ring use a simple way to calculate + else if (reg.type() == "Ring") { + + // Create circular region from reg + const GSkyRegionRing* regring = + dynamic_cast(®); + + // Calculate angular distance between the centres + double ang_dist = m_centre.dist_deg(regring->centre()); + + // Check if the distance is smaller than the sum of the outer radii and the circular radii + if (ang_dist <= (m_radius + regring->radius2())) { + overlap = true; + } + + // Check if two regions overlap + if ((ang_dist + m_radius) < regring->radius1()) { + overlap = true; + } + + } + // ... otherwise throw an exception else { throw GException::feature_not_implemented(G_OVERLAPS, diff --git a/src/sky/GSkyRegionRing.cpp b/src/sky/GSkyRegionRing.cpp index b3b2915..625fff9 100644 --- a/src/sky/GSkyRegionRing.cpp +++ b/src/sky/GSkyRegionRing.cpp @@ -29,6 +29,7 @@ #include #endif #include "GSkyRegionRing.hpp" +#include "GSkyRegionCircle.hpp" #include "GTools.hpp" /* __ Method name definitions ____________________________________________ */ @@ -136,7 +137,6 @@ GSkyRegionRing::GSkyRegionRing(const std::string& line) } - /***********************************************************************//** * @brief Copy constructor * @@ -498,16 +498,21 @@ bool GSkyRegionRing::contains(const GSkyRegion& reg) const if (reg.type() == "Ring") { // Create circular region from reg - const GSkyRegionRing* regcirc = + const GSkyRegionRing* regring = dynamic_cast(®); // Calculate angular distance between the centres - double ang_dist = m_centre.dist_deg(regcirc->centre()); + double ang_dist = m_centre.dist_deg(regring->centre()); // Check if the region is contained in this - if ((ang_dist + regcirc->radius2()) <= m_radius2 && (ang_dist - regcirc->radius1()) >= m_radius1) { + if ((ang_dist + regring->radius2()) <= m_radius2 && (ang_dist - regring->radius2()) >= m_radius1) { fully_inside = true; } + + if ( (ang_dist + m_radius1) <= regring->radius1() && (ang_dist + regring->radius2()) <= m_radius2) { + fully_inside = true; + } + } @@ -539,24 +544,45 @@ bool GSkyRegionRing::overlaps(const GSkyRegion& reg) const if (reg.type() == "Ring") { // Create circular region from reg - const GSkyRegionRing* regcirc = + const GSkyRegionRing* regring = dynamic_cast(®); // Calculate angular distance between the centres - double ang_dist = m_centre.dist_deg(regcirc->centre()); + double ang_dist = m_centre.dist_deg(regring->centre()); // Check if the distance is smaller than the sum of both outer radii - if (ang_dist <= (m_radius2 + regcirc->radius2())) { + if (ang_dist <= (m_radius2 + regring->radius2())) { overlap = true; } // Check if the distance is smaller than the sum of both inner radii - if (ang_dist <= (m_radius1 + regcirc->radius1())) { + if (ang_dist <= (m_radius1 + regring->radius1())) { overlap = true; } // Check if two regions overlap - if (ang_dist >= (m_radius1 + regcirc->radius1()) && ang_dist <= (m_radius2 + regcirc->radius2())) { + if (ang_dist >= (m_radius1 + regring->radius1()) && ang_dist <= (m_radius2 + regring->radius2())) { + overlap = true; + } + + } + // If other region is Circle use a simple way to calculate + else if (reg.type() == "Circle") { + + // Create circular region from reg + const GSkyRegionCircle* regcirc = + dynamic_cast(®); + + // Calculate angular distance between the centres + double ang_dist = m_centre.dist_deg(regcirc->centre()); + + // Check if the distance is smaller than the sum of the outer radii and the circular radii + if (ang_dist <= (m_radius2 + regcirc->radius())) { + overlap = true; + } + + // Check if two regions overlap + if ((ang_dist + m_radius2) < regcirc->radius()) { overlap = true; } @@ -599,7 +625,7 @@ void GSkyRegionRing::init_members(void) /***********************************************************************//** * @brief Copy class members * - * @param[in] region Circular sky region. + * @param[in] region ring sky region. ***************************************************************************/ void GSkyRegionRing::copy_members(const GSkyRegionRing& region) { @@ -637,4 +663,4 @@ void GSkyRegionRing::compute_solid_angle(void) // Return return; -} +} \ No newline at end of file diff --git a/test/test_GSky.cpp b/test/test_GSky.cpp index df44237..cd03ed6 100644 --- a/test/test_GSky.cpp +++ b/test/test_GSky.cpp @@ -929,6 +929,12 @@ void TestGSky::test_GSkyRegionCircle_logic(void) GSkyRegionCircle refregion_raoffset(refdir_raoffset,10); GSkyRegionCircle refregion_rapole(refdir_rapole,3); GSkyRegionCircle refregion_decpole(refdir_decpole,3); + + GSkyRegionRing refregion_ring_smaller(refdir_radeczerozero,6,8); + GSkyRegionRing refregion_ring_larger(refdir_radeczerozero,20,25); + GSkyRegionRing refregion_ring_raoffset(refdir_raoffset,10,20); + GSkyRegionRing refregion_ring_rapole(refdir_rapole,3,6); + GSkyRegionRing refregion_ring_decpole(refdir_decpole,3,5); // Test contain dirs test_assert(refregion.contains(refdir_radeczerozero),"test for containment"); @@ -949,6 +955,12 @@ void TestGSky::test_GSkyRegionCircle_logic(void) test_assert(refregion.overlaps(refregion_raoffset),"test3 for overlap"); test_assert(!refregion.overlaps(refregion_decpole),"test4 for overlap"); + test_assert(refregion.overlaps(refregion_ring_smaller),"test5 for overlap"); + test_assert(refregion.overlaps(refregion_ring_larger),"test6 for overlap"); + test_assert(refregion.overlaps(refregion_ring_raoffset),"test7 for overlap"); + test_assert(refregion.overlaps(refregion_ring_rapole),"test8 for overlap"); + test_assert(!refregion.overlaps(refregion_ring_decpole),"test9 for overlap"); + // Exit test return; } @@ -1167,6 +1179,12 @@ void TestGSky::test_GSkyRegionRing_logic(void) GSkyRegionRing refregion_raoffset(refdir_raoffset,10,20); GSkyRegionRing refregion_rapole(refdir_rapole,3,6); GSkyRegionRing refregion_decpole(refdir_decpole,3,5); + + GSkyRegionCircle refregion_circle_smaller(refdir_radeczerozero,12); + GSkyRegionCircle refregion_circle_larger(refdir_radeczerozero,12); + GSkyRegionCircle refregion_circle_raoffset(refdir_raoffset,12); + GSkyRegionCircle refregion_circle_rapole(refdir_rapole,12); + GSkyRegionCircle refregion_circle_decpole(refdir_decpole,12); // Test contain dirs test_assert(!refregion.contains(refdir_radeczerozero),"test for containment"); @@ -1175,9 +1193,9 @@ void TestGSky::test_GSkyRegionRing_logic(void) test_assert(!refregion.contains(refdir_outside_refregion), "test2 for containment"); // Test contain regions - test_assert(!refregion.contains(refregion_smaller),"test for containment region"); + test_assert(refregion.contains(refregion_smaller),"test for containment region"); test_assert(!refregion.contains(refregion_larger), "test for containment region2 "); - test_assert(!refregion.contains(refregion), "test3 for containment region"); + test_assert(refregion.contains(refregion), "test3 for containment region"); test_assert(!refregion.contains(refdir_rapole), "rapole for containment region"); test_assert(!refregion_decpole.contains(refdir_ndecpole), "rapole for containment region"); @@ -1187,6 +1205,13 @@ void TestGSky::test_GSkyRegionRing_logic(void) test_assert(refregion.overlaps(refregion_larger),"test2 for overlap"); test_assert(refregion.overlaps(refregion_raoffset),"test3 for overlap"); test_assert(!refregion.overlaps(refregion_decpole),"test4 for overlap"); + + test_assert(refregion.overlaps(refregion_circle_smaller),"test5 for overlap"); + test_assert(refregion.overlaps(refregion_circle_larger),"test6 for overlap"); + test_assert(refregion.overlaps(refregion_circle_raoffset),"test7 for overlap"); + test_assert(refregion.overlaps(refregion_circle_rapole),"test8 for overlap"); + test_assert(!refregion.overlaps(refregion_circle_decpole),"test9 for overlap"); + // Exit test return;