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; | ... | ... |