Commit 583acb24044a9b8e8dcc5e5d3fb6a5acc9227795
1 parent
06869a15
test_GSky circle and ring overlap
Showing
4 changed files
with
91 additions
and
16 deletions
include/GSkyRegionRing.hpp
... | ... | @@ -94,9 +94,10 @@ protected: |
94 | 94 | void compute_solid_angle(void); |
95 | 95 | |
96 | 96 | // Protected members |
97 | - GSkyDir m_centre; //!< Centre or reference point of the region | |
98 | - double m_radius1; //!< Radius of inner ring the region [deg] | |
99 | - double m_radius2; //!< Radius of outer ring the region [deg] | |
97 | + GSkyDir m_centre; //!< Centre or reference point of the region | |
98 | + double m_radius1; //!< Radius of inner ring the region [deg] | |
99 | + double m_radius2; //!< Radius of outer ring the region [deg] | |
100 | + | |
100 | 101 | }; |
101 | 102 | |
102 | 103 | ... | ... |
src/sky/GSkyRegionCircle.cpp
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 | #include <config.h> |
30 | 30 | #endif |
31 | 31 | #include "GSkyRegionCircle.hpp" |
32 | +#include "GSkyRegionRing.hpp" | |
32 | 33 | #include "GTools.hpp" |
33 | 34 | |
34 | 35 | /* __ Method name definitions ____________________________________________ */ |
... | ... | @@ -522,6 +523,28 @@ bool GSkyRegionCircle::overlaps(const GSkyRegion& reg) const |
522 | 523 | |
523 | 524 | } |
524 | 525 | |
526 | + // If other region is ring use a simple way to calculate | |
527 | + else if (reg.type() == "Ring") { | |
528 | + | |
529 | + // Create circular region from reg | |
530 | + const GSkyRegionRing* regring = | |
531 | + dynamic_cast<const GSkyRegionRing*>(®); | |
532 | + | |
533 | + // Calculate angular distance between the centres | |
534 | + double ang_dist = m_centre.dist_deg(regring->centre()); | |
535 | + | |
536 | + // Check if the distance is smaller than the sum of the outer radii and the circular radii | |
537 | + if (ang_dist <= (m_radius + regring->radius2())) { | |
538 | + overlap = true; | |
539 | + } | |
540 | + | |
541 | + // Check if two regions overlap | |
542 | + if ((ang_dist + m_radius) < regring->radius1()) { | |
543 | + overlap = true; | |
544 | + } | |
545 | + | |
546 | + } | |
547 | + | |
525 | 548 | // ... otherwise throw an exception |
526 | 549 | else { |
527 | 550 | throw GException::feature_not_implemented(G_OVERLAPS, | ... | ... |
src/sky/GSkyRegionRing.cpp
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 | #include <config.h> |
30 | 30 | #endif |
31 | 31 | #include "GSkyRegionRing.hpp" |
32 | +#include "GSkyRegionCircle.hpp" | |
32 | 33 | #include "GTools.hpp" |
33 | 34 | |
34 | 35 | /* __ Method name definitions ____________________________________________ */ |
... | ... | @@ -136,7 +137,6 @@ GSkyRegionRing::GSkyRegionRing(const std::string& line) |
136 | 137 | |
137 | 138 | } |
138 | 139 | |
139 | - | |
140 | 140 | /***********************************************************************//** |
141 | 141 | * @brief Copy constructor |
142 | 142 | * |
... | ... | @@ -498,16 +498,21 @@ bool GSkyRegionRing::contains(const GSkyRegion& reg) const |
498 | 498 | if (reg.type() == "Ring") { |
499 | 499 | |
500 | 500 | // Create circular region from reg |
501 | - const GSkyRegionRing* regcirc = | |
501 | + const GSkyRegionRing* regring = | |
502 | 502 | dynamic_cast<const GSkyRegionRing*>(®); |
503 | 503 | |
504 | 504 | // Calculate angular distance between the centres |
505 | - double ang_dist = m_centre.dist_deg(regcirc->centre()); | |
505 | + double ang_dist = m_centre.dist_deg(regring->centre()); | |
506 | 506 | |
507 | 507 | // Check if the region is contained in this |
508 | - if ((ang_dist + regcirc->radius2()) <= m_radius2 && (ang_dist - regcirc->radius1()) >= m_radius1) { | |
508 | + if ((ang_dist + regring->radius2()) <= m_radius2 && (ang_dist - regring->radius2()) >= m_radius1) { | |
509 | 509 | fully_inside = true; |
510 | 510 | } |
511 | + | |
512 | + if ( (ang_dist + m_radius1) <= regring->radius1() && (ang_dist + regring->radius2()) <= m_radius2) { | |
513 | + fully_inside = true; | |
514 | + } | |
515 | + | |
511 | 516 | |
512 | 517 | } |
513 | 518 | |
... | ... | @@ -539,24 +544,45 @@ bool GSkyRegionRing::overlaps(const GSkyRegion& reg) const |
539 | 544 | if (reg.type() == "Ring") { |
540 | 545 | |
541 | 546 | // Create circular region from reg |
542 | - const GSkyRegionRing* regcirc = | |
547 | + const GSkyRegionRing* regring = | |
543 | 548 | dynamic_cast<const GSkyRegionRing*>(®); |
544 | 549 | |
545 | 550 | // Calculate angular distance between the centres |
546 | - double ang_dist = m_centre.dist_deg(regcirc->centre()); | |
551 | + double ang_dist = m_centre.dist_deg(regring->centre()); | |
547 | 552 | |
548 | 553 | // Check if the distance is smaller than the sum of both outer radii |
549 | - if (ang_dist <= (m_radius2 + regcirc->radius2())) { | |
554 | + if (ang_dist <= (m_radius2 + regring->radius2())) { | |
550 | 555 | overlap = true; |
551 | 556 | } |
552 | 557 | |
553 | 558 | // Check if the distance is smaller than the sum of both inner radii |
554 | - if (ang_dist <= (m_radius1 + regcirc->radius1())) { | |
559 | + if (ang_dist <= (m_radius1 + regring->radius1())) { | |
555 | 560 | overlap = true; |
556 | 561 | } |
557 | 562 | |
558 | 563 | // Check if two regions overlap |
559 | - if (ang_dist >= (m_radius1 + regcirc->radius1()) && ang_dist <= (m_radius2 + regcirc->radius2())) { | |
564 | + if (ang_dist >= (m_radius1 + regring->radius1()) && ang_dist <= (m_radius2 + regring->radius2())) { | |
565 | + overlap = true; | |
566 | + } | |
567 | + | |
568 | + } | |
569 | + // If other region is Circle use a simple way to calculate | |
570 | + else if (reg.type() == "Circle") { | |
571 | + | |
572 | + // Create circular region from reg | |
573 | + const GSkyRegionCircle* regcirc = | |
574 | + dynamic_cast<const GSkyRegionCircle*>(®); | |
575 | + | |
576 | + // Calculate angular distance between the centres | |
577 | + double ang_dist = m_centre.dist_deg(regcirc->centre()); | |
578 | + | |
579 | + // Check if the distance is smaller than the sum of the outer radii and the circular radii | |
580 | + if (ang_dist <= (m_radius2 + regcirc->radius())) { | |
581 | + overlap = true; | |
582 | + } | |
583 | + | |
584 | + // Check if two regions overlap | |
585 | + if ((ang_dist + m_radius2) < regcirc->radius()) { | |
560 | 586 | overlap = true; |
561 | 587 | } |
562 | 588 | |
... | ... | @@ -599,7 +625,7 @@ void GSkyRegionRing::init_members(void) |
599 | 625 | /***********************************************************************//** |
600 | 626 | * @brief Copy class members |
601 | 627 | * |
602 | - * @param[in] region Circular sky region. | |
628 | + * @param[in] region ring sky region. | |
603 | 629 | ***************************************************************************/ |
604 | 630 | void GSkyRegionRing::copy_members(const GSkyRegionRing& region) |
605 | 631 | { |
... | ... | @@ -637,4 +663,4 @@ void GSkyRegionRing::compute_solid_angle(void) |
637 | 663 | |
638 | 664 | // Return |
639 | 665 | return; |
640 | 666 | -} |
667 | +} | |
641 | 668 | \ No newline at end of file | ... | ... |
test/test_GSky.cpp
... | ... | @@ -929,6 +929,12 @@ void TestGSky::test_GSkyRegionCircle_logic(void) |
929 | 929 | GSkyRegionCircle refregion_raoffset(refdir_raoffset,10); |
930 | 930 | GSkyRegionCircle refregion_rapole(refdir_rapole,3); |
931 | 931 | GSkyRegionCircle refregion_decpole(refdir_decpole,3); |
932 | + | |
933 | + GSkyRegionRing refregion_ring_smaller(refdir_radeczerozero,6,8); | |
934 | + GSkyRegionRing refregion_ring_larger(refdir_radeczerozero,20,25); | |
935 | + GSkyRegionRing refregion_ring_raoffset(refdir_raoffset,10,20); | |
936 | + GSkyRegionRing refregion_ring_rapole(refdir_rapole,3,6); | |
937 | + GSkyRegionRing refregion_ring_decpole(refdir_decpole,3,5); | |
932 | 938 | |
933 | 939 | // Test contain dirs |
934 | 940 | test_assert(refregion.contains(refdir_radeczerozero),"test for containment"); |
... | ... | @@ -949,6 +955,12 @@ void TestGSky::test_GSkyRegionCircle_logic(void) |
949 | 955 | test_assert(refregion.overlaps(refregion_raoffset),"test3 for overlap"); |
950 | 956 | test_assert(!refregion.overlaps(refregion_decpole),"test4 for overlap"); |
951 | 957 | |
958 | + test_assert(refregion.overlaps(refregion_ring_smaller),"test5 for overlap"); | |
959 | + test_assert(refregion.overlaps(refregion_ring_larger),"test6 for overlap"); | |
960 | + test_assert(refregion.overlaps(refregion_ring_raoffset),"test7 for overlap"); | |
961 | + test_assert(refregion.overlaps(refregion_ring_rapole),"test8 for overlap"); | |
962 | + test_assert(!refregion.overlaps(refregion_ring_decpole),"test9 for overlap"); | |
963 | + | |
952 | 964 | // Exit test |
953 | 965 | return; |
954 | 966 | } |
... | ... | @@ -1167,6 +1179,12 @@ void TestGSky::test_GSkyRegionRing_logic(void) |
1167 | 1179 | GSkyRegionRing refregion_raoffset(refdir_raoffset,10,20); |
1168 | 1180 | GSkyRegionRing refregion_rapole(refdir_rapole,3,6); |
1169 | 1181 | GSkyRegionRing refregion_decpole(refdir_decpole,3,5); |
1182 | + | |
1183 | + GSkyRegionCircle refregion_circle_smaller(refdir_radeczerozero,12); | |
1184 | + GSkyRegionCircle refregion_circle_larger(refdir_radeczerozero,12); | |
1185 | + GSkyRegionCircle refregion_circle_raoffset(refdir_raoffset,12); | |
1186 | + GSkyRegionCircle refregion_circle_rapole(refdir_rapole,12); | |
1187 | + GSkyRegionCircle refregion_circle_decpole(refdir_decpole,12); | |
1170 | 1188 | |
1171 | 1189 | // Test contain dirs |
1172 | 1190 | test_assert(!refregion.contains(refdir_radeczerozero),"test for containment"); |
... | ... | @@ -1175,9 +1193,9 @@ void TestGSky::test_GSkyRegionRing_logic(void) |
1175 | 1193 | test_assert(!refregion.contains(refdir_outside_refregion), "test2 for containment"); |
1176 | 1194 | |
1177 | 1195 | // Test contain regions |
1178 | - test_assert(!refregion.contains(refregion_smaller),"test for containment region"); | |
1196 | + test_assert(refregion.contains(refregion_smaller),"test for containment region"); | |
1179 | 1197 | test_assert(!refregion.contains(refregion_larger), "test for containment region2 "); |
1180 | - test_assert(!refregion.contains(refregion), "test3 for containment region"); | |
1198 | + test_assert(refregion.contains(refregion), "test3 for containment region"); | |
1181 | 1199 | |
1182 | 1200 | test_assert(!refregion.contains(refdir_rapole), "rapole for containment region"); |
1183 | 1201 | test_assert(!refregion_decpole.contains(refdir_ndecpole), "rapole for containment region"); |
... | ... | @@ -1187,6 +1205,13 @@ void TestGSky::test_GSkyRegionRing_logic(void) |
1187 | 1205 | test_assert(refregion.overlaps(refregion_larger),"test2 for overlap"); |
1188 | 1206 | test_assert(refregion.overlaps(refregion_raoffset),"test3 for overlap"); |
1189 | 1207 | test_assert(!refregion.overlaps(refregion_decpole),"test4 for overlap"); |
1208 | + | |
1209 | + test_assert(refregion.overlaps(refregion_circle_smaller),"test5 for overlap"); | |
1210 | + test_assert(refregion.overlaps(refregion_circle_larger),"test6 for overlap"); | |
1211 | + test_assert(refregion.overlaps(refregion_circle_raoffset),"test7 for overlap"); | |
1212 | + test_assert(refregion.overlaps(refregion_circle_rapole),"test8 for overlap"); | |
1213 | + test_assert(!refregion.overlaps(refregion_circle_decpole),"test9 for overlap"); | |
1214 | + | |
1190 | 1215 | |
1191 | 1216 | // Exit test |
1192 | 1217 | return; | ... | ... |