diff --git a/test/algorithms/intersection1.cpp b/test/algorithms/intersection1.cpp new file mode 100644 index 000000000..997c4d5a5 --- /dev/null +++ b/test/algorithms/intersection1.cpp @@ -0,0 +1,816 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +#include + +#ifndef BOOST_TEST_MODULE +#define BOOST_TEST_MODULE test_intersection +#endif + +#include + +#include "test_intersection1.hpp" + +#include +#include +#include + +typedef bg::model::point point_type; +typedef bg::model::segment segment_type; +typedef bg::model::linestring linestring_type; +typedef bg::model::multi_linestring multi_linestring_type; + + + +//=========================================================================== +//=========================================================================== +//=========================================================================== + + +BOOST_AUTO_TEST_CASE( test_difference_linestring_linestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** LINESTRING / LINESTRING INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_intersection_of_geometries tester; + + tester() + (from_wkt("LINESTRING(0 0,5 0)"), + from_wkt("LINESTRING(3 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,3 0),(4 0,5 0))"), + "lldf01"); +#if 0 + tester() + (from_wkt("LINESTRING(3 0,4 0)"), + from_wkt("LINESTRING(0 0,5 0)"), + from_wkt("MULTILINESTRING()"), + "lldf01-1"); + + tester() + (from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("LINESTRING(3 0,6 0)"), + from_wkt("MULTILINESTRING((0 0,3 0))"), + "lldf01-2"); + + tester() + (from_wkt("LINESTRING(3 0,6 0)"), + from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("MULTILINESTRING((4 0,6 0))"), + "lldf01-3"); + + tester() + (from_wkt("LINESTRING(0 0,6 0)"), + from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("MULTILINESTRING((4 0,6 0))"), + "lldf01-4"); + + tester() + (from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("LINESTRING(0 0,6 0)"), + from_wkt("MULTILINESTRING()"), + "lldf01-5"); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"), + from_wkt("MULTILINESTRING((0 0,4 0),(5 0,20 0))"), + "lldf01-6"); + + tester() + (from_wkt("LINESTRING(-20 0,20 0)"), + from_wkt("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"), + from_wkt("MULTILINESTRING((-20 0,4 0),(5 0,20 0))"), + "lldf01-7"); + + tester() + (from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("LINESTRING(2 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,2 0))"), + "lldf01-8"); + + tester() + (from_wkt("LINESTRING(2 0,4 0)"), + from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("MULTILINESTRING()"), + "lldf01-9"); + + tester() + (from_wkt("LINESTRING(0 0,2 0)"), + from_wkt("LINESTRING(4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0))"), + "lldf01-10"); + + tester() + (from_wkt("LINESTRING(0 0,2 0)"), + from_wkt("LINESTRING(2 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0))"), + "lldf01-11"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,4 0)"), + from_wkt("LINESTRING(3 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0,3 0))"), + "lldf01-11a"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,4 0)"), + from_wkt("LINESTRING(3 0,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0,3 0))"), + "lldf01-11b"); + + tester() + (from_wkt("LINESTRING(0 0,6 0)"), + from_wkt("LINESTRING(2 0,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,6 0))"), + "lldf01-12"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,5 5,10 5,15 0)"), + from_wkt("LINESTRING(-1 6,0 5,15 5)"), + from_wkt("MULTILINESTRING((0 0,1 0,5 5),(10 5,15 0))"), + "lldf02"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0))"), + "lldf03"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,5 5,10 5,15 0,20 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((1 0,5 5,10 5,15 0))"), + "lldf04"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,25 1)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (20 0,25 1))"), + "lldf05"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0))"), + "lldf05-1"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0))"), + "lldf06"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,25 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0))"), + "lldf07"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,19 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0))"), + "lldf08"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 1))"), + "lldf09"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 1))"), + "lldf10"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,20 0,\ + 30 0,31 1)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(2 0,3 0),\ + (4 0,5 5,10 5,15 0),(30 0,31 1))"), + "lldf11"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,31 0)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(2 0,3 0),\ + (4 0,5 5,10 5,15 0),(30 0,31 0))"), + "lldf11-1"); + + tester() + (from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("MULTILINESTRING()"), + "lldf12"); + + tester() + (from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("LINESTRING(3 1,2 0,0 0)"), + from_wkt("MULTILINESTRING()"), + "lldf12-1"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 5,4 0)"), + from_wkt("LINESTRING(1 0,2 1,3 5,4 0,5 10)"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "lldf13"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 0,2.5 0,3 1)"), + from_wkt("LINESTRING(0 0,2 0,2.5 0,3 1)"), + from_wkt("MULTILINESTRING()"), + "lldf14"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 5,4 0)"), + from_wkt("LINESTRING(1 0,2 1,3 5)"), + from_wkt("MULTILINESTRING((0 0,1 0),(3 5,4 0))"), + "lldf15"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 2)"), + from_wkt("LINESTRING(0.5 0,1 0,3 2,4 5)"), + from_wkt("MULTILINESTRING((0 0,0.5 0))"), + "lldf16"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 2)"), + from_wkt("LINESTRING(4 5,3 2,1 0,0.5 0)"), + from_wkt("MULTILINESTRING((0 0,0.5 0))"), + "lldf16-r"); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1,30 1)"), + from_wkt("LINESTRING(1 1,2 0,3 1,20 1,25 1)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(25 1,30 1))"), + "lldf17"); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1,21 0,30 0)"), + from_wkt("LINESTRING(1 1,2 0,3 1,20 1,25 0)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1,21 0,30 0))"), + "lldf18"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19a"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19a-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19b"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,6 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19c"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19d"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0,3 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19e"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19f"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,5 0,4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19f-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,5 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19g"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,5 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0))"), + "lldf19g-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"), + from_wkt("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,35 0)"), + from_wkt("MULTILINESTRING((0 0,20 0),(25 0,30 0,30 30,10 30),\ + (10 0,10 -10,15 0,20 0),(25 0,35 0))"), + "lldf20"); + + tester() + (from_wkt("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"), + from_wkt("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,15 0)"), + from_wkt("MULTILINESTRING((0 0,15 0),(30 0,30 30,10 30),\ + (10 0,10 -10,15 0))"), + "lldf20a"); +#endif +} + + + +#if 0 +BOOST_AUTO_TEST_CASE( test_difference_linestring_multilinestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** LINESTRING / MULTILINESTRING DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1))"), + "lmldf01" + ); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1))"), + "lmldf02" + ); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,10 0,20 1))"), + "lmldf03" + ); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1))"), + "lmldf04" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "lmldf07" + ); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((-1 1,0 0))"), + "lmldf07a" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING()"), + "lmldf07b" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "lmldf08" + ); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 0.5,3 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0))"), + "lmldf09" + ); + + tester() + (from_wkt("LINESTRING(0 0,1 0,1.5 0,2 0.5,3 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(1.5 0,2 0.5,3 0))"), + "lmldf10" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\ + (3 1,4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf12" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((1 0,19 0,20 1),\ + (2 0,18 0,19 1),(3 0,17 0,18 1),\ + (4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf13" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf14" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf15" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf15a" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,5 0,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf16" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,5 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmldf16a" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmldf17" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0,26 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmldf17a" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmldf18" + ); + + tester() + (from_wkt("LINESTRING(0 0,18 0,19 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmldf18a" + ); +} + + + + + +BOOST_AUTO_TEST_CASE( test_difference_multilinestring_linestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTILINESTRING / LINESTRING DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("LINESTRING(1 1,2 2,4 3)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + "mlldf01" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("LINESTRING(1 1,2 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0))"), + "mlldf02" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("LINESTRING(-1 -1,1 0,101 0,200 -1)"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "mlldf03" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("LINESTRING(0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlldf04" + ); +} + + + + + + + +BOOST_AUTO_TEST_CASE( test_difference_multilinestring_multilinestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTILINESTRING / MULTILINESTRING DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef multi_linestring_type ML; + + typedef test_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + "mlmldf01" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0))"), + "mlmldf02" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,10 0,20 1),\ + (1 0,2 0),(5 0,7 0))"), + "mlmldf03" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0))"), + "mlmldf04" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\ + (10 10,20 10,30 20))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),\ + (10 20,15 10,25 10,30 15))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0),(10 10,15 10),(20 10,30 20))"), + "mlmldf05" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\ + (10 10,20 10,30 20))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),\ + (-1 -1,0 0,9 0,11 10,12 10,13 0.3,14 0.4,15 0.5),\ + (10 20,15 10,25 10,30 15))"), + from_wkt("MULTILINESTRING((9 0,10 0,13 0.3),(15 0.5,20 1),\ + (10 10,11 10),(12 10,15 10),(20 10,30 20))"), + "mlmldf06" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "mlmldf07" + ); + + tester() + (from_wkt("MULTILINESTRING((-1 1,0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((-1 1,0 0))"), + "mlmldf07a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING()"), + "mlmldf07b" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "mlmldf08" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0))"), + "mlmldf09" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(1.5 0,2 0.5,3 0))"), + "mlmldf10" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 1,100 1,101 0),\ + (0 0,101 0))"), + from_wkt("MULTILINESTRING((1 0,1 1,2 1,3 0,4 0,5 1,6 1,\ + 7 0,8 0,9 1,10 1,11 0,12 0,13 1,14 1,15 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 1),(2 1,5 1),(6 1,9 1),\ + (10 1,13 1),(14 1,100 1,101 0),(0 0,1 0))"), + "mlmldf11" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\ + (3 1,4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf12" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((1 0,19 0,20 1),\ + (2 0,18 0,19 1),(3 0,17 0,18 1),\ + (4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf13" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf14" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf15" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf15a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,5 0,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf16" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,5 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmldf16a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmldf17" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0,26 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmldf17a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmldf18" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,18 0,19 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmldf18a" + ); +} +#endif diff --git a/test/algorithms/sym_difference1.cpp b/test/algorithms/sym_difference1.cpp new file mode 100644 index 000000000..281bccf03 --- /dev/null +++ b/test/algorithms/sym_difference1.cpp @@ -0,0 +1,819 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +#include + +#ifndef BOOST_TEST_MODULE +#define BOOST_TEST_MODULE test_sym_difference +#endif + +#include + +#include "test_sym_difference1.hpp" + +#include +#include +#include + +typedef bg::model::point point_type; +typedef bg::model::segment segment_type; +typedef bg::model::linestring linestring_type; +typedef bg::model::multi_linestring multi_linestring_type; + + + +//=========================================================================== +//=========================================================================== +//=========================================================================== + + +BOOST_AUTO_TEST_CASE( test_sym_difference_linestring_linestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** LINESTRING / LINESTRING SYMMETRIC DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_sym_difference_of_geometries tester; + + tester() + (from_wkt("LINESTRING(0 0,5 0)"), + from_wkt("LINESTRING(3 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,3 0),(4 0,5 0))"), + "llsdf01"); + + tester() + (from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("LINESTRING(3 0,6 0)"), + from_wkt("MULTILINESTRING((0 0,3 0),(4 0,6 0))"), + "llsdf01-1"); + + tester() + (from_wkt("LINESTRING(0 0,6 0)"), + from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("MULTILINESTRING((4 0,6 0))"), + "llsdf01-2"); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"), + from_wkt("MULTILINESTRING((0 0,4 0),(5 0,20 0),\ + (0 0,1 1,2 0,3 1,4 0),(5 0,6 1,7 -1,8 0))"), + "llsdf01-3"); + + tester() + (from_wkt("LINESTRING(-20 0,20 0)"), + from_wkt("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"), + from_wkt("MULTILINESTRING((-20 0,4 0),(5 0,20 0),\ + (0 0,1 1,2 0,3 1,4 0),(5 0,6 1,7 -1,8 0))"), + "llsdf01-4"); + + tester() + (from_wkt("LINESTRING(0 0,4 0)"), + from_wkt("LINESTRING(2 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,2 0))"), + "llsdf01-5"); + + tester() + (from_wkt("LINESTRING(0 0,2 0)"), + from_wkt("LINESTRING(4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,5 0))"), + "llsdf01-6"); + + tester() + (from_wkt("LINESTRING(0 0,2 0)"), + from_wkt("LINESTRING(2 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(2 0,5 0))"), + "llsdf01-7"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,4 0)"), + from_wkt("LINESTRING(3 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0,3 0),(4 0,5 0))"), + "llsdf01-8"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,4 0)"), + from_wkt("LINESTRING(3 0,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0,3 0),(4 0,5 0))"), + "llsdf01-9"); + + tester() + (from_wkt("LINESTRING(0 0,6 0)"), + from_wkt("LINESTRING(2 0,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,6 0))"), + "llsdf01-10"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,5 5,10 5,15 0)"), + from_wkt("LINESTRING(-1 6,0 5,15 5)"), + from_wkt("MULTILINESTRING((0 0,1 0,5 5),(10 5,15 0),\ + (-1 6,0 5,5 5),(10 5,15 5))"), + "llsdf02"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (-1 0,0 0),(1 0,15 0),(20 0,30 0))"), + "llsdf03"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,5 5,10 5,15 0,20 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((1 0,5 5,10 5,15 0),\ + (-1 0,0 0),(1 0,15 0),(20 0,30 0))"), + "llsdf04"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,25 1)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (20 0,25 1),(-1 0,0 0),(1 0,15 0),(20 0,30 0))"), + "llsdf05"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (-1 0,0 0),(1 0,15 0))"), + "llsdf05-1"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0),(-1 0,0 0),(1 0,15 0))"), + "llsdf06"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,25 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0),(-1 0,0 0),(1 0,15 0))"), + "llsdf07"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"), + from_wkt("LINESTRING(-1 0,19 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 0),(-1 0,0 0),(1 0,15 0))"), + "llsdf08"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"), + from_wkt("LINESTRING(-1 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 1),(-1 0,0 0),(1 0,15 0))"), + "llsdf09"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(1 0,5 5,10 5,15 0),\ + (30 0,31 1),(-1 -1,0 0),(1 0,2 1,3 0,15 0))"), + "llsdf10"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,20 0,\ + 30 0,31 1)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(2 0,3 0),\ + (4 0,5 5,10 5,15 0),(30 0,31 1),(-1 -1,0 0),\ + (2 0,2.5 1,3 0),(4 0,15 0))"), + "llsdf11"); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,31 0)"), + from_wkt("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"), + from_wkt("MULTILINESTRING((-1 1,0 0),(2 0,3 0),\ + (4 0,5 5,10 5,15 0),(30 0,31 0),(-1 -1,0 0),\ + (2 0,2.5 1,3 0),(4 0,15 0))"), + "llsdf11-1"); + + tester() + (from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("MULTILINESTRING()"), + "llsdf12"); + + tester() + (from_wkt("LINESTRING(0 0,2 0,3 1)"), + from_wkt("LINESTRING(3 1,2 0,0 0)"), + from_wkt("MULTILINESTRING()"), + "llsdf12-1"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 5,4 0)"), + from_wkt("LINESTRING(1 0,2 1,3 5,4 0,5 10)"), + from_wkt("MULTILINESTRING((0 0,1 0),(4 0,5 10))"), + "llsdf13"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 0,2.5 0,3 1)"), + from_wkt("LINESTRING(0 0,2 0,2.5 0,3 1)"), + from_wkt("MULTILINESTRING()"), + "llsdf14"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 5,4 0)"), + from_wkt("LINESTRING(1 0,2 1,3 5)"), + from_wkt("MULTILINESTRING((0 0,1 0),(3 5,4 0))"), + "llsdf15"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 2)"), + from_wkt("LINESTRING(0.5 0,1 0,3 2,4 5)"), + from_wkt("MULTILINESTRING((0 0,0.5 0),(3 2,4 5))"), + "llsdf16"); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 1,3 2)"), + from_wkt("LINESTRING(4 5,3 2,1 0,0.5 0)"), + from_wkt("MULTILINESTRING((0 0,0.5 0),(4 5,3 2))"), + "llsdf16-r"); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1,30 1)"), + from_wkt("LINESTRING(1 1,2 0,3 1,20 1,25 1)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(25 1,30 1),\ + (1 1,2 0,3 1,20 1))"), + "llsdf17"); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1,21 0,30 0)"), + from_wkt("LINESTRING(1 1,2 0,3 1,20 1,25 0)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1,21 0,30 0),\ + (1 1,2 0,3 1,20 1,25 0))"), + "llsdf18"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0,5 1))"), + "llsdf19"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 1,4 0,4 1,20 1,5 0))"), + "llsdf19-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0))"), + "llsdf19a"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (4 0,4 1,20 1,5 0))"), + "llsdf19a-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0))"), + "llsdf19b"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,6 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0),(5 0,6 1))"), + "llsdf19c"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0))"), + "llsdf19d"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0,3 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0),(3 0,3 1))"), + "llsdf19e"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,4 0),(5 0,5 1))"), + "llsdf19f"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,5 0,4 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 1,5 0),(4 0,4 1,20 1,5 0))"), + "llsdf19f-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(1 0,5 0,20 1,4 1,5 0,5 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 0,20 1,4 1,5 0,5 1))"), + "llsdf19g"); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("LINESTRING(5 1,5 0,4 1,20 1,5 0,1 0)"), + from_wkt("MULTILINESTRING((0 0,1 0),(5 0,30 0),\ + (5 1,5 0,4 1,20 1,5 0))"), + "llsdf19g-r"); + + tester() + (from_wkt("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"), + from_wkt("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,35 0)"), + from_wkt("MULTILINESTRING((0 0,20 0),(25 0,30 0,30 30,10 30),\ + (10 0,10 -10,15 0,20 0),(25 0,35 0),\ + (5 5,10 0),(10 30,20 0),(25 0,25 25,50 0,40 0))"), + "llsdf20"); + + tester() + (from_wkt("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"), + from_wkt("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,15 0)"), + from_wkt("MULTILINESTRING((0 0,15 0),(30 0,30 30,10 30),\ + (10 0,10 -10,15 0),(5 5,10 0),(10 30,20 0),\ + (25 0,25 25,50 0,40 0))"), + "llsdf20a"); +} + + + +BOOST_AUTO_TEST_CASE( test_sym_difference_linestring_multilinestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** LINESTRING / MULTILINESTRING SYMMETRIC DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_sym_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),\ + (1 1,2 2,4 3),(1 1,2 2,5 3))"), + "lmlsdf01" + ); + +#if 0 + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1))"), + "lmlsdf02" + ); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,10 0,20 1))"), + "lmlsdf03" + ); + + tester() + (from_wkt("LINESTRING(0 0,10 0,20 1)"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1))"), + "lmlsdf04" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "lmlsdf07" + ); + + tester() + (from_wkt("LINESTRING(-1 1,0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((-1 1,0 0))"), + "lmlsdf07a" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING()"), + "lmlsdf07b" + ); + + tester() + (from_wkt("LINESTRING(0 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "lmlsdf08" + ); + + tester() + (from_wkt("LINESTRING(0 0,1 0,2 0.5,3 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0))"), + "lmlsdf09" + ); + + tester() + (from_wkt("LINESTRING(0 0,1 0,1.5 0,2 0.5,3 0,101 0)"), + from_wkt("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(1.5 0,2 0.5,3 0))"), + "lmlsdf10" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\ + (3 1,4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf12" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((1 0,19 0,20 1),\ + (2 0,18 0,19 1),(3 0,17 0,18 1),\ + (4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf13" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf14" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf15" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf15a" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,5 0,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf16" + ); + + tester() + (from_wkt("LINESTRING(0 0,20 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,5 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "lmlsdf16a" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmlsdf17" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0,26 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmlsdf17a" + ); + + tester() + (from_wkt("LINESTRING(0 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmlsdf18" + ); + + tester() + (from_wkt("LINESTRING(0 0,18 0,19 0,30 0)"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "lmlsdf18a" + ); +#endif +} + + + + +BOOST_AUTO_TEST_CASE( test_sym_difference_multilinestring_linestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTILINESTRING / LINESTRING SYMMETRIC DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef linestring_type L; + typedef multi_linestring_type ML; + + typedef test_sym_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("LINESTRING(1 1,2 2,4 3)"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\ + (1 1,2 2,4 3))"), + "mllsdf01" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("LINESTRING(1 1,2 0,4 0)"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0),(1 1,2 0))"), + "mllsdf02" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("LINESTRING(-1 -1,1 0,101 0,200 -1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(-1 -1,1 0),(101 0,200 -1))"), + "mllsdf03" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("LINESTRING(0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1)"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0),\ + (0 1,1 0),(19 0,20 1,19 1,18 0),(2 0,1 1,2 1,3 0),\ + (17 0,18 1,17 1,16 0),(4 0,3 1))"), + "mllsdf04" + ); +} + + + + + + +#if 0 +BOOST_AUTO_TEST_CASE( test_sym_difference_multilinestring_multilinestring ) +{ +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTILINESTRING / MULTILINESTRING SYMMETRIC DIFFERENCE ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef multi_linestring_type ML; + + typedef test_sym_difference_of_geometries tester; + + // disjoint linestrings + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"), + from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + "mlmlsdf01" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0))"), + "mlmlsdf02" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(5 0,10 0,20 1),\ + (1 0,2 0),(5 0,7 0))"), + "mlmlsdf03" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0))"), + "mlmlsdf04" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\ + (10 10,20 10,30 20))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),\ + (10 20,15 10,25 10,30 15))"), + from_wkt("MULTILINESTRING((0 0,2 0),(4 0,10 0,20 1),\ + (1 0,2 0),(4 0,7 0),(10 10,15 10),(20 10,30 20))"), + "mlmlsdf05" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\ + (10 10,20 10,30 20))"), + from_wkt("MULTILINESTRING((1 1,2 0,4 0),\ + (-1 -1,0 0,9 0,11 10,12 10,13 0.3,14 0.4,15 0.5),\ + (10 20,15 10,25 10,30 15))"), + from_wkt("MULTILINESTRING((9 0,10 0,13 0.3),(15 0.5,20 1),\ + (10 10,11 10),(12 10,15 10),(20 10,30 20))"), + "mlmlsdf06" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "mlmlsdf07" + ); + + tester() + (from_wkt("MULTILINESTRING((-1 1,0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((-1 1,0 0))"), + "mlmlsdf07a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((-1 -1,0 0,50 0),\ + (19 -1,20 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING()"), + "mlmlsdf07b" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0))"), + "mlmlsdf08" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0,2 0.5,3 0))"), + "mlmlsdf09" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0))"), + from_wkt("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(1.5 0,2 0.5,3 0))"), + "mlmlsdf10" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,1 1,100 1,101 0),\ + (0 0,101 0))"), + from_wkt("MULTILINESTRING((1 0,1 1,2 1,3 0,4 0,5 1,6 1,\ + 7 0,8 0,9 1,10 1,11 0,12 0,13 1,14 1,15 0),\ + (-1 -1,1 0,101 0,200 -1))"), + from_wkt("MULTILINESTRING((0 0,1 1),(2 1,5 1),(6 1,9 1),\ + (10 1,13 1),(14 1,100 1,101 0),(0 0,1 0))"), + "mlmlsdf11" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\ + (3 1,4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf12" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((1 0,19 0,20 1),\ + (2 0,18 0,19 1),(3 0,17 0,18 1),\ + (4 0,16 0,17 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf13" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\ + 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf14" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf15" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf15a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 2,5 0,6 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf16" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,20 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (6 0,5 0,4 2,2 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,20 0))"), + "mlmlsdf16a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmlsdf17" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,4 0,5 2,20 2,25 0,26 2))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmlsdf17a" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmlsdf18" + ); + + tester() + (from_wkt("MULTILINESTRING((0 0,18 0,19 0,30 0))"), + from_wkt("MULTILINESTRING((0 1,1 0,19 0,20 1),\ + (2 2,5 -1,15 2,18 0))"), + from_wkt("MULTILINESTRING((0 0,1 0),(19 0,30 0))"), + "mlmlsdf18a" + ); +} +#endif diff --git a/test/algorithms/test_intersection1.hpp b/test/algorithms/test_intersection1.hpp new file mode 100644 index 000000000..85382a53b --- /dev/null +++ b/test/algorithms/test_intersection1.hpp @@ -0,0 +1,288 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +#ifndef BOOST_GEOMETRY_TEST_INTERSECTION1_HPP +#define BOOST_GEOMETRY_TEST_INTERSECTION1_HPP + +#include "from_wkt.hpp" +#include +#include +#include + +#include +#include +#include +#include + + +namespace bg = ::boost::geometry; + +#include "to_svg.hpp" + + +template +struct ls_less +{ + typedef typename boost::range_iterator::type It1; + typedef typename boost::range_iterator::type It2; + + typedef bg::less::type> PointLess; + + bool operator()(LS1 const& ls1, LS2 const& ls2) const + { + if ( boost::size(ls1) != boost::size(ls2) ) + return boost::size(ls1) < boost::size(ls2); + + It1 it1 = boost::begin(ls1); + It2 it2 = boost::begin(ls2); + PointLess less; + for (; it1 != boost::end(ls1); ++it1, ++it2) + { + if ( less(*it1, *it2) ) + return true; + if ( less(*it2, *it1) ) + return false; + } + return false; + } +}; + + +template +struct multilinestring_equals +{ + static inline + bool apply(MultiLinestring1 const& mls1_, MultiLinestring2 const& mls2_) + { + MultiLinestring1 mls1 = mls1_; + MultiLinestring2 mls2 = mls2_; + BOOST_CHECK(boost::size(mls1) == boost::size(mls2)); + + typedef typename boost::range_iterator + < + MultiLinestring1 const + >::type ls1_iterator; + + typedef typename boost::range_iterator + < + MultiLinestring2 const + >::type ls2_iterator; + + typedef typename boost::range_value::type Linestring1; + + typedef typename boost::range_value::type Linestring2; + + typedef typename boost::range_iterator + < + Linestring1 const + >::type pt1_iterator; + + typedef typename boost::range_iterator + < + Linestring2 const + >::type pt2_iterator; + + typedef ls_less LS_Less; + + std::sort(boost::begin(mls1), boost::end(mls1), LS_Less()); + std::sort(boost::begin(mls2), boost::end(mls2), LS_Less()); + + if ( boost::size(mls1) == boost::size(mls2) ) + { + ls1_iterator it1 = boost::begin(mls1); + ls2_iterator it2 = boost::begin(mls2); + for (; it1 != boost::end(mls1); ++it1, ++it2) + { + BOOST_CHECK( boost::size(*it1) == boost::size(*it2) ); + if ( boost::size(*it1) == boost::size(*it2) ) + { + pt1_iterator pit1 = boost::begin(*it1); + pt2_iterator pit2 = boost::begin(*it2); + for (; pit1 != boost::end(*it1); ++pit1, ++pit2) + { + BOOST_CHECK( bg::equals(*pit1, *pit2) ); + } + } + } + } + return true; + } +}; + +struct equals +{ + template + bool operator()(MLS1 const& mls1, MLS2 const& mls2) const + { +#if 0 + if ( multilinestring_equals::apply(mls1, mls2) ) + { + return true; + } + + MLS1 rmls1 = mls1; + bg::reverse(rmls1); + if ( multilinestring_equals::apply(rmls1, mls2) ) + { + return true; + } + + MLS2 rmls2 = mls2; + bg::reverse(rmls2); + if ( multilinestring_equals::apply(mls1, rmls2) ) + { + return true; + } +#endif + return multilinestring_equals::apply(mls1, mls2); + } +}; + + +//================================================================== +//================================================================== +// intersection of (linear) geometries +//================================================================== +//================================================================== + +template +< + typename Geometry1, typename Geometry2, + typename MultiLineString +> +struct test_intersection_of_geometries +{ + void base_test(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_int, + bool test_vector_and_deque = true, + bool reverse_output_for_checking = false) const + { + typedef typename boost::range_value::type LineString; + typedef std::vector LineStringVector; + typedef std::deque LineStringDeque; + + MultiLineString mls_output; + + LineStringVector ls_vector_output; + LineStringDeque ls_deque_output; + + bg::intersection(geometry1, geometry2, mls_output); + + if ( reverse_output_for_checking ) + { + bg::reverse(mls_output); + } + + BOOST_CHECK( equals()(mls_int, mls_output) ); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Geometry #1: " << bg::wkt(geometry1) << std::endl; + std::cout << "Geometry #2: " << bg::wkt(geometry2) << std::endl; + std::cout << "intersection : " << bg::wkt(mls_output) << std::endl; + std::cout << "expected intersection : " << bg::wkt(mls_int) + << std::endl; + std::cout << std::endl; + std::cout << "************************************" << std::endl; + std::cout << std::endl; + std::cout << std::endl; +#endif + + if ( test_vector_and_deque ) + { +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl; + std::cout << "Testing with vector and deque as output container..." + << std::endl; +#endif + bg::intersection(geometry1, geometry2, ls_vector_output); + bg::intersection(geometry1, geometry2, ls_deque_output); + + BOOST_CHECK((multilinestring_equals + < + MultiLineString, LineStringVector + >::apply(mls_int, ls_vector_output) + )); + + BOOST_CHECK((multilinestring_equals + < + MultiLineString, LineStringDeque + >::apply(mls_int, ls_deque_output) + )); +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Done!" << std::endl << std::endl; +#endif + } + + // check the intersection where the order of the two + // geometries is reversed + bg::clear(mls_output); + bg::intersection(geometry2, geometry1, mls_output); + + if ( reverse_output_for_checking ) + { + bg::reverse(mls_output); + } + + BOOST_CHECK( equals()(mls_int, mls_output) ); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Geometry #1: " << bg::wkt(geometry2) << std::endl; + std::cout << "Geometry #2: " << bg::wkt(geometry1) << std::endl; + std::cout << "intersection : " << bg::wkt(mls_output) << std::endl; + std::cout << "expected intersection : " << bg::wkt(mls_int) + << std::endl; + std::cout << std::endl; + std::cout << "************************************" << std::endl; + std::cout << std::endl; + std::cout << std::endl; +#endif + } + + + + void operator()(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_int) const + { + Geometry1 rg1(geometry1); + bg::reverse(rg1); + + Geometry2 rg2(geometry2); + bg::reverse(rg2); + + base_test(geometry1, geometry2, mls_int); + // base_test(geometry1, rg2, mls_diff, false); + // base_test(rg1, geometry2, mls_diff, false, true); + // base_test(rg1, rg2, mls_diff, false, true); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl; + std::cout << std::endl; +#endif + } + + + void operator()(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_int, + std::string const& test_case_str) const + { +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "test case: " << test_case_str << std::endl; + std::stringstream sstr; + sstr << "svgs/" << test_case_str << ".svg"; + to_svg(geometry1, geometry2, sstr.str()); +#endif + this->operator()(geometry1, geometry2, mls_int); + } +}; + + +#endif // BOOST_GEOMETRY_TEST_INTERSECTION1_HPP diff --git a/test/algorithms/test_sym_difference1.hpp b/test/algorithms/test_sym_difference1.hpp new file mode 100644 index 000000000..2e8c70172 --- /dev/null +++ b/test/algorithms/test_sym_difference1.hpp @@ -0,0 +1,280 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +#ifndef BOOST_GEOMETRY_TEST_SYM_DIFFERENCE1_HPP +#define BOOST_GEOMETRY_TEST_SYM_DIFFERENCE1_HPP + +#include "from_wkt.hpp" +#include +#include +#include + +#include +#include +#include +#include + + +namespace bg = ::boost::geometry; + +#include "to_svg.hpp" + + +template +struct ls_less +{ + typedef typename boost::range_iterator::type It1; + typedef typename boost::range_iterator::type It2; + + typedef bg::less::type> PointLess; + + bool operator()(LS1 const& ls1, LS2 const& ls2) const + { + if ( boost::size(ls1) != boost::size(ls2) ) + return boost::size(ls1) < boost::size(ls2); + + It1 it1 = boost::begin(ls1); + It2 it2 = boost::begin(ls2); + PointLess less; + for (; it1 != boost::end(ls1); ++it1, ++it2) + { + if ( less(*it1, *it2) ) + return true; + if ( less(*it2, *it1) ) + return false; + } + return false; + } +}; + + +template +struct multilinestring_equals +{ + static inline + bool apply(MultiLinestring1 const& mls1_, MultiLinestring2 const& mls2_) + { + MultiLinestring1 mls1 = mls1_; + MultiLinestring2 mls2 = mls2_; + if ( boost::size(mls1) != boost::size(mls2) ) + { + return false; + } + + typedef typename boost::range_iterator + < + MultiLinestring1 const + >::type ls1_iterator; + + typedef typename boost::range_iterator + < + MultiLinestring2 const + >::type ls2_iterator; + + typedef typename boost::range_value::type Linestring1; + + typedef typename boost::range_value::type Linestring2; + + typedef typename boost::range_iterator + < + Linestring1 const + >::type pt1_iterator; + + typedef typename boost::range_iterator + < + Linestring2 const + >::type pt2_iterator; + + typedef ls_less LS_Less; + + std::sort(boost::begin(mls1), boost::end(mls1), LS_Less()); + std::sort(boost::begin(mls2), boost::end(mls2), LS_Less()); + + ls1_iterator it1 = boost::begin(mls1); + ls2_iterator it2 = boost::begin(mls2); + for (; it1 != boost::end(mls1); ++it1, ++it2) + { + if ( boost::size(*it1) != boost::size(*it2) ) + { + return false; + } + pt1_iterator pit1 = boost::begin(*it1); + pt2_iterator pit2 = boost::begin(*it2); + for (; pit1 != boost::end(*it1); ++pit1, ++pit2) + { + if ( !bg::equals(*pit1, *pit2) ) + { + return false; + } + } + } + return true; + } +}; + + +struct equals +{ + template + bool operator()(MLS1 const& mls1, MLS2 const& mls2) const + { + if ( multilinestring_equals::apply(mls1, mls2) ) + { + return true; + } + + MLS1 rmls1 = mls1; + bg::reverse(rmls1); + if ( multilinestring_equals::apply(rmls1, mls2) ) + { + return true; + } + + MLS2 rmls2 = mls2; + bg::reverse(rmls2); + if ( multilinestring_equals::apply(mls1, rmls2) ) + { + return true; + } + + return multilinestring_equals::apply(rmls1, rmls2); + } +}; + + +//================================================================== +//================================================================== +// symmetric difference of (linear) geometries +//================================================================== +//================================================================== + +template +< + typename Geometry1, typename Geometry2, + typename MultiLineString +> +struct test_sym_difference_of_geometries +{ + void base_test(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_sym_diff, + bool test_vector_and_deque = false) const + { + typedef typename boost::range_value::type LineString; + typedef std::vector LineStringVector; + typedef std::deque LineStringDeque; + + MultiLineString mls_output; + + LineStringVector ls_vector_output; + LineStringDeque ls_deque_output; + + bg::sym_difference(geometry1, geometry2, mls_output); + + BOOST_CHECK( equals()(mls_sym_diff, mls_output) ); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Geometry #1: " << bg::wkt(geometry1) << std::endl; + std::cout << "Geometry #2: " << bg::wkt(geometry2) << std::endl; + std::cout << "sym_difference : " << bg::wkt(mls_output) << std::endl; + std::cout << "expected sym_difference : " << bg::wkt(mls_sym_diff) + << std::endl; + std::cout << std::endl; + std::cout << "************************************" << std::endl; + std::cout << std::endl; + std::cout << std::endl; +#endif + + if ( test_vector_and_deque ) + { +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl; + std::cout << "Testing with vector and deque as output container..." + << std::endl; +#endif + bg::sym_difference(geometry1, geometry2, ls_vector_output); + bg::sym_difference(geometry1, geometry2, ls_deque_output); + + BOOST_CHECK((multilinestring_equals + < + MultiLineString, LineStringVector + >::apply(mls_sym_diff, ls_vector_output) + )); + + BOOST_CHECK((multilinestring_equals + < + MultiLineString, LineStringDeque + >::apply(mls_sym_diff, ls_deque_output) + )); +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Done!" << std::endl << std::endl; +#endif + } + + // check the symmetric difference where the order of the two + // geometries is reversed + bg::clear(mls_output); + bg::sym_difference(geometry2, geometry1, mls_output); + + BOOST_CHECK( equals()(mls_sym_diff, mls_output) ); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "Geometry #1: " << bg::wkt(geometry2) << std::endl; + std::cout << "Geometry #2: " << bg::wkt(geometry1) << std::endl; + std::cout << "sym_difference : " << bg::wkt(mls_output) << std::endl; + std::cout << "expected sym_difference : " << bg::wkt(mls_sym_diff) + << std::endl; + std::cout << std::endl; + std::cout << "************************************" << std::endl; + std::cout << std::endl; + std::cout << std::endl; +#endif + } + + + + void operator()(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_sym_diff) const + { + Geometry1 rg1(geometry1); + bg::reverse(rg1); + + Geometry2 rg2(geometry2); + bg::reverse(rg2); + + base_test(geometry1, geometry2, mls_sym_diff, true); + // base_test(geometry1, rg2, mls_sym_diff); + // base_test(rg1, geometry2, mls_sym_diff); + base_test(rg1, rg2, mls_sym_diff); + +#ifdef GEOMETRY_TEST_DEBUG + std::cout << std::endl; + std::cout << std::endl; +#endif + } + + + void operator()(Geometry1 const& geometry1, + Geometry2 const& geometry2, + MultiLineString const& mls_sym_diff, + std::string const& test_case_str) const + { +#ifdef GEOMETRY_TEST_DEBUG + std::cout << "test case: " << test_case_str << std::endl; + std::stringstream sstr; + sstr << "svgs/" << test_case_str << ".svg"; + to_svg(geometry1, geometry2, sstr.str()); +#endif + this->operator()(geometry1, geometry2, mls_sym_diff); + } +}; + + +#endif // BOOST_GEOMETRY_TEST_SYM_DIFFERENCE1_HPP