// Boost.Geometry // Unit Test // Copyright (c) 2021, Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #ifndef BOOST_TEST_MODULE #define BOOST_TEST_MODULE test_closest_points_areal_areal #endif #include "common.hpp" #include "empty_geometry.hpp" namespace bg = boost::geometry; //=========================================================================== template void test_closest_points_polygon_or_ring_polygon_or_ring(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "polygon or ring /polygon or ring closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::ring Ring; typedef bg::model::polygon Polygon; typedef test_geometry tester; tester::apply("POLYGON((2 2,2 0,0 2,2 2))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); tester::apply("POLYGON((2 2,2 0,0 2,2 2))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies, true, true); // rings intersect tester::apply("POLYGON((1 1,0.1 0.1,2 1,1 1))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); // ring inside ring //TODO: disable temporarily; possible bug in intersection //tester::apply("POLYGON((0.1 0.1,0.2 0.1,0.1 0.2,0.1 0.1))", // "POLYGON((0 0,1 0,0 1,0 0))", // "SEGMENT(0.1 0.1,0.1 0.1)", // strategies); typedef test_geometry tester2; tester2::apply("POLYGON((2 2,2 0,0 2,2 2))", "POLYGON((0 0,1 0,0 1,0 0)(0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); // ring-polygon intersect tester2::apply("POLYGON((1 1,0.1 0.1,2 1,1 1))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); typedef test_geometry tester3; tester3::apply("POLYGON((2 2,2 0,0 2,2 2)(1.5 1,1 1.5,1.5 1.5,1.5 1))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); // polygon-ring intersect tester3::apply("POLYGON((1 1,0.1 0.1,2 1,1 1))", "POLYGON((0 0,1 0,0 1,0 0))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); typedef test_geometry tester4; tester4::apply("POLYGON((2 2,2 0,0 2,2 2)(1.5 1,1 1.5,1.5 1.5,1.5 1))", "POLYGON((0 0,1 0,0 1,0 0)(0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); // polygons one included in the other tester4::apply("POLYGON((10 10,10 0,0 10,10 10)(8 8,4 8,8 4,8 8))", "POLYGON((9 9,9 2,2 9,9 9))", "SEGMENT(9 9,9 9)", strategies); tester4::apply("POLYGON((10 10,10 0,0 10,10 10)(8 8,4 8,8 4,8 8))", "POLYGON((9 9,9 2,2 9,9 9)(7 7,6 7,7 6,7 7))", "SEGMENT(9 9,9 9)", strategies); //touches(cartesian), intersects(spherical,geographic) tester4::apply("POLYGON((10 10,10 0,0 10,10 10)(8 8,4 8,8 4,8 8))", "POLYGON((9 9,9 2,2 9,9 9)(7 7,6 7,7 5,7 7))", "SEGMENT(7 5,7 5)", "SEGMENT(6.99222 5.01561,6.99222 5.01561)", strategies); //intersects tester4::apply("POLYGON((10 10,10 0,0 10,10 10)(8 8,4 8,8 4,8 8))", "POLYGON((9 9,9 2,2 9,9 9)(7 7,6 7,7 4.5,7 7))", "SEGMENT(6.66667 5.33333,6.66667 5.33333)", "SEGMENT(6.66211 5.34732,6.66211 5.34732)", strategies); } //=========================================================================== template void test_closest_points_polygon_multi_polygon(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "polygon / multi-polygon closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::ring Ring; typedef bg::model::polygon Polygon; typedef bg::model::multi_polygon MultiPolygon; typedef test_geometry tester; tester::apply("POLYGON((2 2,2 0,0 2,2 2))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); tester::apply("POLYGON((2 2,2 0,0 2,2 2))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies, true, true); // multipolygon-ring intersect tester::apply("POLYGON((1 1,0.1 0.1,2 1,1 1))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0))((2 2,2 0,0 2,2 2)))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); typedef test_geometry tester2; tester2::apply("POLYGON((2 2,2 0,0 2,2 2))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); // multipolygon-polygon intersect tester2::apply("POLYGON((1 1,0.1 0.1,2 1,1 1)(1 0.9,1.02 0.9,1 0.8,1 0.9))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0))((2 2,2 0,0 2,2 2)))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); } //=========================================================================== template void test_closest_points_multi_polygon_multi_polygon(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "multi-polygon / multi-polygon closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::polygon Polygon; typedef bg::model::multi_polygon MultiPolygon; typedef test_geometry tester; tester::apply("MULTIPOLYGON(((2 2,2 0,0 2,2 2)),\ ((1.5 1,1 1.5,1.5 1.5,1.5 1)))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies); tester::apply("MULTIPOLYGON(((2 2,2 0,0 2,2 2)),\ ((1.5 1,1 1.5,1.5 1.5,1.5 1)))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(1.5 0.5,1 0)", "SEGMENT(0.50019 1.50021,0 1)", "SEGMENT(1.496909 0.503379,1 0)", strategies, true, true); // multipolygon-multipolygon intersect tester::apply("MULTIPOLYGON(((1 1,0.1 0.1,2 1,1 1)),\ ((1 0.9,1.02 0.9,1 0.8,1 0.9)))", "MULTIPOLYGON(((0 0,1 0,0 1,0 0))((2 2,2 0,0 2,2 2)))", "SEGMENT(0.5 0.5,0.5 0.5)", "SEGMENT(0.500004 0.500053,0.500004 0.500053)", strategies); } //=========================================================================== template void test_closest_points_box_polygon_or_ring(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "box / polygon or ring closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::ring Ring; typedef bg::model::polygon Polygon; typedef bg::model::box Box; typedef test_geometry tester; tester::apply("BOX(10 10,20 20)", "POLYGON((0 0,2 0,0 2,0 0))", "SEGMENT(10 10,1 1)", "SEGMENT(10 10,0.922834 1.07763)", "SEGMENT(10 10,0.983761 1.0167)", strategies); tester::apply("BOX(10 10,20 20)", "POLYGON((0 0,2 0,0 2,0 0))", "SEGMENT(10 10,1 1)", "SEGMENT(10 10,0.922834 1.07763)", "SEGMENT(10 10,0.983761 1.0167)", strategies, true, true); //intersect tester::apply("BOX(10 10,20 20)", "POLYGON((15 15,15 25,25 30,15 15))", "SEGMENT(15 15,15 15)", strategies); tester::apply("BOX(10 10,20 20)", "POLYGON((0 0,30 0,40 15,30 30,0 30,0 0))", "SEGMENT(20 20,20 20)", strategies); typedef test_geometry tester2; tester2::apply("BOX(10 10,20 20)", "POLYGON((0 0,2 0,0 2,0 0)(0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4))", "SEGMENT(10 10,1 1)", "SEGMENT(10 10,0.922834 1.07763)", "SEGMENT(10 10,0.983761 1.0167)", strategies); //intersect tester2::apply("BOX(10 10,20 20)", "POLYGON((15 15,15 25,25 30,15 15))", "SEGMENT(15 15,15 15)", strategies); tester2::apply("BOX(10 10,20 20)", "POLYGON((0 0,30 0,40 15,30 30,0 30,0 0))", "SEGMENT(20 20,20 20)", strategies); tester::apply("BOX(0 1,100 2)", "POLYGON((0 0,100 3,110 0,0 0))", "SEGMENT(33.3333 1,33.3333 1)", "SEGMENT(19.1476 1,19.1476 1)", "SEGMENT(19.0629 1,19.0629 1)", strategies); } //=========================================================================== template void test_closest_points_box_multi_polygon(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "box / multi-polygon closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::polygon Polygon; typedef bg::model::multi_polygon MultiPolygon; typedef bg::model::box Box; typedef test_geometry tester; tester::apply("BOX(10 10,20 20)", "MULTIPOLYGON(((0 0,2 0,0 2,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(10 10,1 1)", "SEGMENT(10 10,0.922834 1.07763)", "SEGMENT(10 10,0.983761 1.0167)", strategies); tester::apply("BOX(10 10,20 20)", "MULTIPOLYGON(((0 0,2 0,0 2,0 0)),\ ((0.4 0.4,0.4 0.1,0.1 0.4,0.4 0.4)))", "SEGMENT(10 10,1 1)", "SEGMENT(10 10,0.922834 1.07763)", "SEGMENT(10 10,0.983761 1.0167)", strategies, true, true); //intersects tester::apply("BOX(10 10,20 20)", "MULTIPOLYGON(((15 15,15 25,25 30,15 15)),\ ((0 0,0 1,1 1,1 0,0 0)))", "SEGMENT(15 15,15 15)", strategies); tester::apply("BOX(0 1,100 2)", "MULTIPOLYGON(((0 0,100 3,110 0,0 0)),\ ((0 3,3 3,3 4,0 3)))", "SEGMENT(33.3333 1,33.3333 1)", "SEGMENT(19.1476 1,19.1476 1)", "SEGMENT(19.0629 1,19.0629 1)", strategies); } //=========================================================================== template void test_closest_points_box_box(Strategies const& strategies) { #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl; std::cout << "box / box closest_points tests" << std::endl; #endif typedef bg::model::segment Segment; typedef bg::model::box Box; typedef test_geometry tester; tester::apply("BOX(10 10,20 20)", "BOX(30 30,40 40)", "SEGMENT(20 20,30 30)", strategies); tester::apply("BOX(10 10,20 20)", "BOX(30 30,40 40)", "SEGMENT(20 20,30 30)", strategies, true, true); tester::apply("BOX(10 10,20 20)", "BOX(15 30,40 40)", "SEGMENT(15 20,15 30)", strategies, false); tester::apply("BOX(15 30,40 40)", "BOX(10 10,20 20)", "SEGMENT(15 30,15 20)", "SEGMENT(20 30,20 20)", strategies, false); tester::apply("BOX(10 10,20 20)", "BOX(5 30,40 40)", "SEGMENT(10 20,10 30)", strategies); tester::apply("BOX(10 10,20 20)", "BOX(5 30,15 40)", "SEGMENT(10 20,10 30)", "SEGMENT(15 20,15 30)", strategies, false); tester::apply("BOX(5 30,15 40)", "BOX(10 10,20 20)", "SEGMENT(10 30,10 20)", strategies, false); tester::apply("BOX(10 10,20 20)", "BOX(0 30,5 40)", "SEGMENT(10 20,5 30)", strategies); //intersect tester::apply("BOX(10 10,20 20)", "BOX(15 15,30 30)", "SEGMENT(15 15,15 15)", "SEGMENT(20 20,20 20)", strategies, false); tester::apply("BOX(15 15,30 30)", "BOX(10 10,20 20)", "SEGMENT(15 15,15 15)", strategies, false); tester::apply("BOX(10 10,30 30)", "BOX(15 15,20 20)", "SEGMENT(15 15,15 15)", strategies); } //=========================================================================== //=========================================================================== //=========================================================================== template < typename Point, typename Strategies > void test_all_ar_ar(Strategies strategies) { test_closest_points_polygon_or_ring_polygon_or_ring(strategies); test_closest_points_polygon_multi_polygon(strategies); test_closest_points_multi_polygon_multi_polygon(strategies); //test_closest_points_box_polygon_or_ring(strategies); //test_closest_points_box_multi_polygon(strategies); //test_closest_points_box_box(strategies); test_more_empty_input_areal_areal(strategies); } BOOST_AUTO_TEST_CASE( test_all_areal_areal ) { test_all_ar_ar(cartesian()); test_all_ar_ar(spherical()); test_all_ar_ar(spherical( bg::formula::mean_radius(bg::srs::spheroid()))); test_all_ar_ar(andoyer()); test_all_ar_ar(thomas()); test_all_ar_ar(vincenty()); }