From 3b44904c80f75a35b6bd6ca6721695d0874302dc Mon Sep 17 00:00:00 2001 From: Vissarion Fisikopoulos Date: Fri, 14 Jul 2023 16:01:20 +0300 Subject: [PATCH] [test] Move tests from within to covered_by --- .../covered_by/covered_by_sph_geo.cpp | 234 +++++++++++++++++- .../within/within_pointlike_geometry.cpp | 226 ----------------- 2 files changed, 230 insertions(+), 230 deletions(-) diff --git a/test/algorithms/covered_by/covered_by_sph_geo.cpp b/test/algorithms/covered_by/covered_by_sph_geo.cpp index 86e39e343..34e1a5cf2 100644 --- a/test/algorithms/covered_by/covered_by_sph_geo.cpp +++ b/test/algorithms/covered_by/covered_by_sph_geo.cpp @@ -1,6 +1,6 @@ // Boost.Geometry -// Copyright (c) 2016-2022 Oracle and/or its affiliates. +// Copyright (c) 2016-2023 Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle @@ -110,7 +110,7 @@ void test_point_polygon() std::is_same::type, bg::geographic_tag>::value, bg::strategy::within::geographic_winding

, bg::strategy::within::spherical_winding

- > s; + > ws; using poly = bg::model::polygon

; @@ -121,7 +121,7 @@ void test_point_polygon() test_geometry("POINT(-179 0)", "POLYGON((0 0, 0 2, 2 0, 0 -2, 0 0))", false, - s); + ws); test_geometry("POINT(1 0)", "POLYGON((0 0, 0 2, 2 0, 0 -2, 0 0))", @@ -129,7 +129,233 @@ void test_point_polygon() test_geometry("POINT(1 0)", "POLYGON((0 0, 0 2, 2 0, 0 -2, 0 0))", true, - s); + ws); + + using Point = P; + // Segment going through pole + { + bg::model::polygon poly_n1; + bg::read_wkt("POLYGON((-90 80,90 80,90 70,-90 70, -90 80))", poly_n1); + // Points on segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 85), poly_n1, ws), true); + // Points on pole + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 90), poly_n1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 90), poly_n1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 90), poly_n1, ws), true); + } + // Segment going through pole + { + bg::model::polygon poly_n2; + bg::read_wkt("POLYGON((-90 80,90 70,0 70,-90 80))", poly_n2); + // Points on segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 75), poly_n2, ws), true); + // Points outside but on the same level as segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 75), poly_n2, ws), false); + } + // Possibly invalid, 2-segment polygon with segment going through pole + /*{ + bg::model::polygon poly_n; + bg::read_wkt("POLYGON((-90 80,90 70,-90 80))", poly_n); + // Point within + BOOST_CHECK_EQUAL(bg::within(Point(0, 89), poly_n), true); + // Points on segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 75), poly_n), true); + // Points outside but on the same level as segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 75), poly_n), false); + }*/ + // Segment endpoints on North pole with arbitrary longitudes + { + bg::model::polygon poly_n4; + bg::read_wkt("POLYGON((45 90,45 80,-10 80,45 90))", poly_n4); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n4, ws), false); + + // the same polygon but with two points representing the pole + bg::model::polygon poly_n4b; + bg::read_wkt("POLYGON((45 90,45 80,-10 80,60 90,45 90))", poly_n4b); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n4b, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n4b, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n4b, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n4b, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n4b, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n4b, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n4b, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n4b, ws), false); + + bg::model::polygon poly_n5; + bg::read_wkt("POLYGON((0 90,-10 80,45 80,0 90))", poly_n5); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(1, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n5, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n5, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n5, ws), false); + + bg::model::polygon poly_n_4edges; + bg::read_wkt("POLYGON((0 90,-10 70,5 60,20 80,0 90))", poly_n_4edges); + BOOST_CHECK_EQUAL(bg::covered_by(Point(3, 89), poly_n_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 87), poly_n_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 86), poly_n_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 84), poly_n_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 61), poly_n_4edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 81), poly_n_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(7, 50), poly_n_4edges, ws), false); + + bg::model::polygon poly_n_5edges; + bg::read_wkt("POLYGON((0 90,-10 70,5 60,10 85,20 80,0 90))", poly_n_5edges); + BOOST_CHECK_EQUAL(bg::covered_by(Point(3, 89), poly_n_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 87), poly_n_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 86), poly_n_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 84), poly_n_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 61), poly_n_5edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 81), poly_n_5edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(7, 50), poly_n_5edges, ws), false); + } + // Segment going through pole + { + bg::model::polygon poly_s1; + bg::read_wkt("POLYGON((-90 -80,-90 -70,90 -70,90 -80,-90 -80))", poly_s1); + // Points on segment + BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, -85), poly_s1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, -85), poly_s1, ws), true); + // Points on pole + BOOST_CHECK_EQUAL(bg::covered_by(Point(90, -90), poly_s1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -90), poly_s1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -90), poly_s1, ws), true); + } + // Segment endpoints on South pole with arbitrary longitudes + { + bg::model::polygon poly_s2; + bg::read_wkt("POLYGON((45 -90,0 -80,45 -80,45 -90))", poly_s2); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -70), poly_s2, ws), false); + + bg::model::polygon poly_s3; + bg::read_wkt("POLYGON((45 -90,-10 -80,45 -80,45 -90))", poly_s3); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(1, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s3, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s3, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s3, ws), false); + + bg::model::polygon poly_s5; + bg::read_wkt("POLYGON((0 -90,-10 -80,45 -80,0 -90))", poly_s5); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(1, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s5, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s5, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s5, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s5, ws), false); + + bg::model::polygon poly_s4; + bg::read_wkt("POLYGON((0 -89,-10 -80,45 -80,0 -89))", poly_s4); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -71), poly_s4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s4, ws), false); + + //more complex examples + bg::model::polygon poly_s_complex_4edges; + bg::read_wkt("POLYGON((0 -90,-10 -70,5 -60,20 -80,0 -90))", poly_s_complex_4edges); + BOOST_CHECK_EQUAL(bg::covered_by(Point(3, -89), poly_s_complex_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -87), poly_s_complex_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -86), poly_s_complex_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -84), poly_s_complex_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -61), poly_s_complex_4edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -81), poly_s_complex_4edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(7, -50), poly_s_complex_4edges, ws), false); + + bg::model::polygon poly_s_complex_5edges; + bg::read_wkt("POLYGON((0 -90,-10 -70,5 -60,10 -85,20 -80,0 -90))", poly_s_complex_5edges); + BOOST_CHECK_EQUAL(bg::covered_by(Point(3, -89), poly_s_complex_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -87), poly_s_complex_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -86), poly_s_complex_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -84), poly_s_complex_5edges, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -61), poly_s_complex_5edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -81), poly_s_complex_5edges, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(7, -50), poly_s_complex_5edges, ws), false); + } + // Polygon covering nearly half of the globe but no poles + { + bg::model::polygon poly_h1; + bg::read_wkt("POLYGON((170 0, 170 -80,10 -80,0 -80,0 -20,10 -20,10 20,0 20,0 80,10 80,170 80,170 0))", poly_h1); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h1, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h1, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h1, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h1, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h1, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h1, ws), false); + } + // Polygon covering more than half of the globe with both holes + { + bg::model::polygon poly_h2; + bg::read_wkt("POLYGON((180 0, 180 -80,0 -80,10 -80,10 -20,0 -20,0 20,10 20,10 80,0 80,180 80,180 0))", poly_h2); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h2, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h2, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h2, ws), true); + } + // Polygon covering around half of the globe covering south pole + { + bg::model::polygon poly_h3; + bg::read_wkt("POLYGON((180 0, 180 -80,0 -80,0 -20,10 -20,10 20,0 20,0 80,10 80,170 80,180 0))", poly_h3); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h3, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h3, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h3, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h3, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h3, ws), true); + } + // Polygon covering around half of the globe covering north pole + { + bg::model::polygon poly_h4; + bg::read_wkt("POLYGON((180 0, 170 -80,10 -80,10 -20,0 -20,0 20,10 20,10 80,0 80,180 80,180 0))", poly_h4); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h4, ws), true); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h4, ws), false); + BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h4, ws), false); + } + } template diff --git a/test/algorithms/within/within_pointlike_geometry.cpp b/test/algorithms/within/within_pointlike_geometry.cpp index 3dd07da22..0080a514f 100644 --- a/test/algorithms/within/within_pointlike_geometry.cpp +++ b/test/algorithms/within/within_pointlike_geometry.cpp @@ -252,232 +252,6 @@ void test_spherical_geographic() BOOST_CHECK_EQUAL(bg::within(pt_n23, poly_n, ws), false); BOOST_CHECK_EQUAL(bg::within(pt_n24, poly_n, ws), false); } - - // TODO: Move to covered_by tests - - // Segment going through pole - { - bg::model::polygon poly_n1; - bg::read_wkt("POLYGON((-90 80,90 80,90 70,-90 70, -90 80))", poly_n1); - // Points on segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 85), poly_n1, ws), true); - // Points on pole - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 90), poly_n1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 90), poly_n1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 90), poly_n1, ws), true); - } - // Segment going through pole - { - bg::model::polygon poly_n2; - bg::read_wkt("POLYGON((-90 80,90 70,0 70,-90 80))", poly_n2); - // Points on segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 75), poly_n2, ws), true); - // Points outside but on the same level as segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 75), poly_n2, ws), false); - } - // Possibly invalid, 2-segment polygon with segment going through pole - /*{ - bg::model::polygon poly_n; - bg::read_wkt("POLYGON((-90 80,90 70,-90 80))", poly_n); - // Point within - BOOST_CHECK_EQUAL(bg::within(Point(0, 89), poly_n), true); - // Points on segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 85), poly_n), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, 75), poly_n), true); - // Points outside but on the same level as segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, 75), poly_n), false); - }*/ - // Segment endpoints on North pole with arbitrary longitudes - { - bg::model::polygon poly_n4; - bg::read_wkt("POLYGON((45 90,45 80,-10 80,45 90))", poly_n4); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n4, ws), false); - - // the same polygon but with two points representing the pole - bg::model::polygon poly_n4b; - bg::read_wkt("POLYGON((45 90,45 80,-10 80,60 90,45 90))", poly_n4b); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n4b, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n4b, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n4b, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n4b, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n4b, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n4b, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n4b, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n4b, ws), false); - - bg::model::polygon poly_n5; - bg::read_wkt("POLYGON((0 90,-10 80,45 80,0 90))", poly_n5); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(1, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 85), poly_n5, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, 85), poly_n5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, 70), poly_n5, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, 70), poly_n5, ws), false); - - bg::model::polygon poly_n_4edges; - bg::read_wkt("POLYGON((0 90,-10 70,5 60,20 80,0 90))", poly_n_4edges); - BOOST_CHECK_EQUAL(bg::covered_by(Point(3, 89), poly_n_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 87), poly_n_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 86), poly_n_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 84), poly_n_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 61), poly_n_4edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 81), poly_n_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(7, 50), poly_n_4edges, ws), false); - - bg::model::polygon poly_n_5edges; - bg::read_wkt("POLYGON((0 90,-10 70,5 60,10 85,20 80,0 90))", poly_n_5edges); - BOOST_CHECK_EQUAL(bg::covered_by(Point(3, 89), poly_n_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 87), poly_n_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, 86), poly_n_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 84), poly_n_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, 61), poly_n_5edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, 81), poly_n_5edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(7, 50), poly_n_5edges, ws), false); - } - // Segment going through pole - { - bg::model::polygon poly_s1; - bg::read_wkt("POLYGON((-90 -80,-90 -70,90 -70,90 -80,-90 -80))", poly_s1); - // Points on segment - BOOST_CHECK_EQUAL(bg::covered_by(Point(-90, -85), poly_s1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, -85), poly_s1, ws), true); - // Points on pole - BOOST_CHECK_EQUAL(bg::covered_by(Point(90, -90), poly_s1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -90), poly_s1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -90), poly_s1, ws), true); - } - // Segment endpoints on South pole with arbitrary longitudes - { - bg::model::polygon poly_s2; - bg::read_wkt("POLYGON((45 -90,0 -80,45 -80,45 -90))", poly_s2); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -70), poly_s2, ws), false); - - bg::model::polygon poly_s3; - bg::read_wkt("POLYGON((45 -90,-10 -80,45 -80,45 -90))", poly_s3); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(1, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s3, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s3, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s3, ws), false); - - bg::model::polygon poly_s5; - bg::read_wkt("POLYGON((0 -90,-10 -80,45 -80,0 -90))", poly_s5); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(1, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s5, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s5, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -70), poly_s5, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s5, ws), false); - - bg::model::polygon poly_s4; - bg::read_wkt("POLYGON((0 -89,-10 -80,45 -80,0 -89))", poly_s4); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -85), poly_s4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(0, -85), poly_s4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(45, -85), poly_s4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -85), poly_s4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -85), poly_s4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-5, -85), poly_s4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(30, -71), poly_s4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(50, -70), poly_s4, ws), false); - - //more complex examples - bg::model::polygon poly_s_complex_4edges; - bg::read_wkt("POLYGON((0 -90,-10 -70,5 -60,20 -80,0 -90))", poly_s_complex_4edges); - BOOST_CHECK_EQUAL(bg::covered_by(Point(3, -89), poly_s_complex_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -87), poly_s_complex_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -86), poly_s_complex_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -84), poly_s_complex_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -61), poly_s_complex_4edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -81), poly_s_complex_4edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(7, -50), poly_s_complex_4edges, ws), false); - - bg::model::polygon poly_s_complex_5edges; - bg::read_wkt("POLYGON((0 -90,-10 -70,5 -60,10 -85,20 -80,0 -90))", poly_s_complex_5edges); - BOOST_CHECK_EQUAL(bg::covered_by(Point(3, -89), poly_s_complex_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -87), poly_s_complex_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-10, -86), poly_s_complex_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -84), poly_s_complex_5edges, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(-1, -61), poly_s_complex_5edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(15, -81), poly_s_complex_5edges, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(7, -50), poly_s_complex_5edges, ws), false); - } - // Polygon covering nearly half of the globe but no poles - { - bg::model::polygon poly_h1; - bg::read_wkt("POLYGON((170 0, 170 -80,10 -80,0 -80,0 -20,10 -20,10 20,0 20,0 80,10 80,170 80,170 0))", poly_h1); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h1, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h1, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h1, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h1, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h1, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h1, ws), false); - } - // Polygon covering more than half of the globe with both holes - { - bg::model::polygon poly_h2; - bg::read_wkt("POLYGON((180 0, 180 -80,0 -80,10 -80,10 -20,0 -20,0 20,10 20,10 80,0 80,180 80,180 0))", poly_h2); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h2, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h2, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h2, ws), true); - } - // Polygon covering around half of the globe covering south pole - { - bg::model::polygon poly_h3; - bg::read_wkt("POLYGON((180 0, 180 -80,0 -80,0 -20,10 -20,10 20,0 20,0 80,10 80,170 80,180 0))", poly_h3); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h3, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h3, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h3, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h3, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h3, ws), true); - } - // Polygon covering around half of the globe covering north pole - { - bg::model::polygon poly_h4; - bg::read_wkt("POLYGON((180 0, 170 -80,10 -80,10 -20,0 -20,0 20,10 20,10 80,0 80,180 80,180 0))", poly_h4); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 90), poly_h4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 85), poly_h4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 50), poly_h4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, 0), poly_h4, ws), true); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -50), poly_h4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -85), poly_h4, ws), false); - BOOST_CHECK_EQUAL(bg::covered_by(Point(5, -90), poly_h4, ws), false); - } } void test_large_integers()