// Boost.Geometry (aka GGL, Generic Geometry Library) // Unit Test // Copyright (c) 2010-2015 Barend Gehrels, Amsterdam, the Netherlands. // This file was modified by Oracle on 2015, 2017. // Modifications copyright (c) 2015-2017, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include "test_difference.hpp" #include #include #include #ifdef HAVE_TTMATH # include #endif template void test_ticket_10835(std::string const& wkt_out1, std::string const& wkt_out2) { typedef bg::model::point point_type; typedef bg::model::linestring linestring_type; typedef bg::model::multi_linestring multilinestring_type; typedef bg::model::polygon < point_type, /*ClockWise*/false, /*Closed*/false > polygon_type; multilinestring_type multilinestring; bg::read_wkt(ticket_10835[0], multilinestring); polygon_type polygon1; bg::read_wkt(ticket_10835[1], polygon1); polygon_type polygon2; bg::read_wkt(ticket_10835[2], polygon2); multilinestring_type multilinestringOut1; bg::difference(multilinestring, polygon1, multilinestringOut1); std::stringstream stream; stream << bg::wkt(multilinestringOut1); BOOST_CHECK_EQUAL(stream.str(), wkt_out1); multilinestring_type multilinestringOut2; bg::difference(multilinestringOut1, polygon2, multilinestringOut2); stream.str(""); stream.clear(); stream << bg::wkt(multilinestringOut2); BOOST_CHECK_EQUAL(stream.str(), wkt_out2); } template void test_areal_linear() { typedef typename bg::point_type::type point; typedef typename bg::coordinate_type::type ct; std::string const poly_simplex = "POLYGON((1 1,1 3,3 3,3 1,1 1))"; test_one_lp("simplex", "LINESTRING(0 2,4 2)", poly_simplex, 2, 4, 2.0); test_one_lp("case2", "LINESTRING(0 1,4 3)", poly_simplex, 2, 4, sqrt(5.0)); test_one_lp("case3", "LINESTRING(0 1,1 2,3 2,4 3,6 3,7 4)", "POLYGON((2 0,2 5,5 5,5 0,2 0))", 2, 6, 2.0 + 2.0 * sqrt(2.0)); test_one_lp("case4", "LINESTRING(1 1,3 2,1 3)", "POLYGON((0 0,0 4,2 4,2 0,0 0))", 1, 3, sqrt(5.0)); test_one_lp("case5", "LINESTRING(0 1,3 4)", poly_simplex, 2, 4, 2.0 * sqrt(2.0)); test_one_lp("case6", "LINESTRING(1 1,10 3)", "POLYGON((2 0,2 4,3 4,3 1,4 1,4 3,5 3,5 1,6 1,6 3,7 3,7 1,8 1,8 3,9 3,9 0,2 0))", 5, 10, // Pieces are 1 x 2/9: 5.0 * sqrt(1.0 + 4.0/81.0)); test_one_lp("case7", "LINESTRING(1.5 1.5,2.5 2.5)", poly_simplex, 0, 0, 0.0); test_one_lp("case8", "LINESTRING(1 0,2 0)", poly_simplex, 1, 2, 1.0); std::string const poly_9 = "POLYGON((1 1,1 4,4 4,4 1,1 1))"; test_one_lp("case9", "LINESTRING(0 1,1 2,2 2)", poly_9, 1, 2, sqrt(2.0)); test_one_lp("case10", "LINESTRING(0 1,1 2,0 2)", poly_9, 1, 3, 1.0 + sqrt(2.0)); test_one_lp("case11", "LINESTRING(2 2,4 2,3 3)", poly_9, 0, 0, 0.0); test_one_lp("case12", "LINESTRING(2 3,4 4,5 6)", poly_9, 1, 2, sqrt(5.0)); test_one_lp("case13", "LINESTRING(3 2,4 4,2 3)", poly_9, 0, 0, 0.0); test_one_lp("case14", "LINESTRING(5 6,4 4,6 5)", poly_9, 1, 3, 2.0 * sqrt(5.0)); test_one_lp("case15", "LINESTRING(0 2,1 2,1 3,0 3)", poly_9, 2, 4, 2.0); test_one_lp("case16", "LINESTRING(2 2,1 2,1 3,2 3)", poly_9, 0, 0, 0.0); std::string const angly = "LINESTRING(2 2,2 1,4 1,4 2,5 2,5 3,4 3,4 4,5 4,3 6,3 5,2 5,2 6,0 4)"; test_one_lp("case17", angly, "POLYGON((1 1,1 5,4 5,4 1,1 1))", 3, 11, 6.0 + 4.0 * sqrt(2.0)); test_one_lp("case18", angly, "POLYGON((1 1,1 5,5 5,5 1,1 1))", 2, 6, 2.0 + 3.0 * sqrt(2.0)); test_one_lp("case19", "LINESTRING(1 2,1 3,0 3)", poly_9, 1, 2, 1.0); test_one_lp("case20", "LINESTRING(1 2,1 3,2 3)", poly_9, 0, 0, 0.0); // PROPERTIES CHANGED BY switch_to_integer // TODO test_one_lp("case21", "LINESTRING(1 2,1 4,4 4,4 1,2 1,2 2)", poly_9, 0, 0, 0.0); // More collinear (opposite) cases test_one_lp("case22", "LINESTRING(4 1,4 4,7 4)", poly_9, 1, 2, 3.0); test_one_lp("case23", "LINESTRING(4 0,4 4,7 4)", poly_9, 2, 4, 4.0); test_one_lp("case24", "LINESTRING(4 1,4 5,7 5)", poly_9, 1, 3, 4.0); test_one_lp("case25", "LINESTRING(4 0,4 5,7 5)", poly_9, 2, 5, 5.0); test_one_lp("case26", "LINESTRING(4 0,4 3,4 5,7 5)", poly_9, 2, 5, 5.0); test_one_lp("case27", "LINESTRING(4 4,4 5,5 5)", poly_9, 1, 3, 2.0); if (BOOST_GEOMETRY_CONDITION( (! boost::is_same::value)) ) { // Fails for float test_one_lp("case28", "LINESTRING(-1.3 0,-15 0,-1.3 0)", "POLYGON((2 3,-9 -7,12 -13,2 3))", 1, 3, 27.4); } test_one_lp("case29", "LINESTRING(5 5,-10 5,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 1, 3, 20); test_one_lp("case29a", "LINESTRING(1 1,5 5,-10 5,5 5,6 6)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 1, 3, 20); test_one_lp("case30", "LINESTRING(-10 5,5 5,-10 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 2, 4, 20); test_one_lp("case30a", "LINESTRING(-20 10,-10 5,5 5,-10 5,-20 -10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 2, 6, 49.208096); test_one_lp("case31", "LINESTRING(0 5,5 5,0 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 0, 0, 0); test_one_lp("case31", "LINESTRING(0 5,5 5,1 1,9 1,5 5,0 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 0, 0, 0); test_one_lp("case32", "LINESTRING(5 5,0 5,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 0, 0, 0); test_one_lp("case32a", "LINESTRING(-10 10,5 5,0 5,5 5,20 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 2, 4, 21.081851); test_one_lp("case33", "LINESTRING(-5 5,0 5,-5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 1, 3, 10); test_one_lp("case33a", "LINESTRING(-10 10,-5 5,0 5,-5 5,-10 -10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 1, 5, 32.882456); test_one_lp("case33b", "LINESTRING(0 5,-5 5,0 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 1, 3, 10); test_one_lp("case34", "LINESTRING(5 5,0 5,5 5,5 4,0 4,5 4)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 0, 0, 0); test_one_lp("case35", "LINESTRING(5 5,0 5,5 5,5 4,0 4,5 3)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", 0, 0, 0); test_one_lp("case36", "LINESTRING(-1 -1,10 10)", "POLYGON((5 5,15 15,15 5,5 5))", 1, 2, 6 * std::sqrt(2.0)); test_one_lp("case37_1", "LINESTRING(1 1,2 2)", "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))", 1, 2, std::sqrt(2.0)); test_one_lp("case37_2", "LINESTRING(1 1,2 2,3 3)", "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))", 1, 2, std::sqrt(2.0)); test_one_lp("case38", "LINESTRING(0 0,1 1,2 2,3 3)", "POLYGON((0 0,0 9,9 9,9 0,0 0),(0 0,2 1,2 2,1 2,0 0))", 1, 3, 2 * std::sqrt(2.0)); // several linestrings are in the output, the result is geometrically correct // still single linestring could be generated test_one_lp("case39", "LINESTRING(0 0,1 1,2 2,3 3)", "POLYGON((0 0,0 9,9 9,9 0,0 0),(0 0,2 1,2 2,1 2,0 0),(2 2,3 2,3 3,2 3,2 2))", 2, 5, 3 * std::sqrt(2.0)); test_one_lp("case40", "LINESTRING(0 0,1 1,2 2,4 4)", "POLYGON((0 0,0 9,9 9,9 0,0 0),(0 0,2 1,2 2,1 2,0 0),(2 2,3 2,3 3,2 3,2 2))", 2, 5, 3 * std::sqrt(2.0)); test_one_lp("case41", "LINESTRING(0 0,1 1,2 2,9 9)", "POLYGON((0 0,0 9,9 9,9 0,0 0),(0 0,2 1,2 2,1 2,0 0),(2 2,3 2,3 3,2 3,2 2),(7 7,8 7,9 9,7 8,7 7))", 3, 7, 5 * std::sqrt(2.0)); } template void test_all() { typedef bg::model::polygon

polygon; typedef bg::model::linestring

linestring; test_areal_linear(); } int test_main(int, char* []) { test_all >(); test_ticket_10835 ("MULTILINESTRING((5239 2113,5233 2114),(4794 2205,1020 2986))", "MULTILINESTRING((5239 2113,5233 2114),(4794 2205,1460 2895))"); test_ticket_10835 ("MULTILINESTRING((5239 2113,5232.52 2114.34),(4794.39 2205,1020 2986))", "MULTILINESTRING((5239 2113,5232.52 2114.34),(4794.39 2205,1459.78 2895))"); #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) test_all >(); #endif return 0; }