From bda35568f0c837465d719464cd3f8b3b3c76af2a Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Tue, 10 Mar 2015 16:40:12 +0200 Subject: [PATCH 1/4] [algorithms][overlay] implement intersection and difference for pointlike/linear geometries --- .../detail/overlay/intersection_insert.hpp | 80 +++- .../detail/overlay/pointlike_linear.hpp | 344 ++++++++++++++++++ .../detail/overlay/pointlike_pointlike.hpp | 4 +- 3 files changed, 423 insertions(+), 5 deletions(-) create mode 100644 include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp diff --git a/include/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp b/include/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp index 3101de8c3..491a540c1 100644 --- a/include/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp @@ -1,9 +1,9 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) -// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. -// This file was modified by Oracle on 2014. -// Modifications copyright (c) 2014 Oracle and/or its affiliates. +// This file was modified by Oracle on 2014, 2015. +// Modifications copyright (c) 2014-2015 Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle @@ -42,6 +42,7 @@ #include #include +#include #if defined(BOOST_GEOMETRY_DEBUG_FOLLOW) #include @@ -700,6 +701,79 @@ struct intersection_insert {}; +// dispatch for difference/intersection of pointlike-linear geometries +template +< + typename Point, typename Linear, typename PointOut, + overlay_type OverlayType, + bool Reverse1, bool Reverse2, bool ReverseOut, + typename Tag +> +struct intersection_insert + < + Point, Linear, PointOut, OverlayType, + Reverse1, Reverse2, ReverseOut, + point_tag, Tag, point_tag, + false, false, false + > : detail_dispatch::overlay::pointlike_linear_point + < + Point, Linear, PointOut, OverlayType, + point_tag, typename tag_cast::type + > +{}; + + +template +< + typename MultiPoint, typename Linear, typename PointOut, + overlay_type OverlayType, + bool Reverse1, bool Reverse2, bool ReverseOut, + typename Tag +> +struct intersection_insert + < + MultiPoint, Linear, PointOut, OverlayType, + Reverse1, Reverse2, ReverseOut, + multi_point_tag, Tag, point_tag, + false, false, false + > : detail_dispatch::overlay::pointlike_linear_point + < + MultiPoint, Linear, PointOut, OverlayType, + multi_point_tag, + typename tag_cast::type + > +{}; + + +template +< + typename Linestring, typename MultiPoint, typename PointOut, + bool Reverse1, bool Reverse2, bool ReverseOut +> +struct intersection_insert + < + Linestring, MultiPoint, PointOut, overlay_intersection, + Reverse1, Reverse2, ReverseOut, + linestring_tag, multi_point_tag, point_tag, + false, false, false + > +{ + template + static inline OutputIterator apply(Linestring const& linestring, + MultiPoint const& multipoint, + RobustPolicy const& robust_policy, + OutputIterator out, + Strategy const& strategy) + { + return detail_dispatch::overlay::pointlike_linear_point + < + MultiPoint, Linestring, PointOut, overlay_intersection, + multi_point_tag, linear_tag + >::apply(multipoint, linestring, robust_policy, out, strategy); + } +}; + + } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH diff --git a/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp b/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp new file mode 100644 index 000000000..ad8756473 --- /dev/null +++ b/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp @@ -0,0 +1,344 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2015, 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_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_LINEAR_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_LINEAR_HPP + +#include +#include + +#include +#include + +#include + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace overlay +{ + + +// action struct for pointlike-linear difference/intersection +// it works the same as its pointlike-pointlike counterpart, hence the +// derivation +template +struct action_selector_pl_l + : action_selector_pl_pl +{}; + +// difference/intersection of point-linear +template +< + typename Point, + typename Linear, + typename PointOut, + overlay_type OverlayType, + typename Policy +> +struct point_linear_point +{ + template + static inline OutputIterator apply(Point const& point, + Linear const& linear, + RobustPolicy const&, + OutputIterator oit, + Strategy const&) + { + action_selector_pl_l + < + PointOut, OverlayType + >::apply(point, Policy::apply(point, linear), oit); + return oit; + } +}; + +// difference/intersection of multipoint-segment +template +< + typename MultiPoint, + typename Segment, + typename PointOut, + overlay_type OverlayType, + typename Policy +> +struct multipoint_segment_point +{ + template + static inline OutputIterator apply(MultiPoint const& multipoint, + Segment const& segment, + RobustPolicy const&, + OutputIterator oit, + Strategy const&) + { + for (typename boost::range_iterator::type + it = boost::begin(multipoint); + it != boost::end(multipoint); + ++it) + { + action_selector_pl_l + < + PointOut, OverlayType + >::apply(*it, Policy::apply(*it, segment), oit); + } + + return oit; + } +}; + + +// difference/intersection of multipoint-linear +template +< + typename MultiPoint, + typename Linear, + typename PointOut, + overlay_type OverlayType, + typename Policy +> +class multipoint_linear_point +{ +private: + // structs for partition -- start + struct expand_box + { + template + static inline void apply(Box& total, Geometry const& geometry) + { + geometry::expand(total, geometry::return_envelope(geometry)); + } + + }; + + struct overlaps_box + { + template + static inline bool apply(Box const& box, Geometry const& geometry) + { + return ! geometry::disjoint(geometry, box); + } + }; + + template + class item_visitor_type + { + public: + item_visitor_type(OutputIterator& oit) : m_oit(oit) {} + + template + inline void apply(Item1 const& item1, Item2 const& item2) + { + action_selector_pl_l + < + PointOut, overlay_intersection + >::apply(item1, Policy::apply(item1, item2), m_oit); + } + + private: + OutputIterator& m_oit; + }; + // structs for partition -- end + + class segment_range + { + public: + typedef geometry::segment_iterator const_iterator; + typedef const_iterator iterator; + + segment_range(Linear const& linear) + : m_linear(linear) + {} + + const_iterator begin() const + { + return geometry::segments_begin(m_linear); + } + + const_iterator end() const + { + return geometry::segments_end(m_linear); + } + + private: + Linear const& m_linear; + }; + + template + static inline OutputIterator get_common_points(MultiPoint const& multipoint, + Linear const& linear, + OutputIterator oit) + { + item_visitor_type item_visitor(oit); + + segment_range rng(linear); + + geometry::partition + < + geometry::model::box + < + typename boost::range_value::type + >, + expand_box, + overlaps_box + >::apply(multipoint, rng, item_visitor); + + return oit; + } + +public: + template + static inline OutputIterator apply(MultiPoint const& multipoint, + Linear const& linear, + RobustPolicy const& robust_policy, + OutputIterator oit, + Strategy const& strategy) + { + typedef std::vector + < + typename boost::range_value::type + > point_vector_type; + + point_vector_type common_points; + + // compute the common points + get_common_points(multipoint, linear, + std::back_inserter(common_points)); + + return multipoint_multipoint_point + < + MultiPoint, point_vector_type, PointOut, OverlayType + >::apply(multipoint, common_points, robust_policy, oit, strategy); + } +}; + + +}} // namespace detail::overlay +#endif // DOXYGEN_NO_DETAIL + + +#ifndef DOXYGEN_NO_DISPATCH +namespace detail_dispatch { namespace overlay +{ + +// dispatch struct for pointlike-linear difference/intersection computation +template +< + typename PointLike, + typename Linear, + typename PointOut, + overlay_type OverlayType, + typename Tag1, + typename Tag2 +> +struct pointlike_linear_point + : not_implemented +{}; + + +template +< + typename Point, + typename Linear, + typename PointOut, + overlay_type OverlayType +> +struct pointlike_linear_point + < + Point, Linear, PointOut, OverlayType, point_tag, linear_tag + > : detail::overlay::point_linear_point + < + Point, Linear, PointOut, OverlayType, + detail::not_ + > +{}; + + +template +< + typename Point, + typename Segment, + typename PointOut, + overlay_type OverlayType +> +struct pointlike_linear_point + < + Point, Segment, PointOut, OverlayType, point_tag, segment_tag + > : detail::overlay::point_linear_point + < + Point, Segment, PointOut, OverlayType, + detail::not_ + > +{}; + + +template +< + typename MultiPoint, + typename Linear, + typename PointOut, + overlay_type OverlayType +> +struct pointlike_linear_point + < + MultiPoint, Linear, PointOut, OverlayType, multi_point_tag, linear_tag + > : detail::overlay::multipoint_linear_point + < + MultiPoint, Linear, PointOut, OverlayType, + detail::not_ + > +{}; + + +template +< + typename MultiPoint, + typename Segment, + typename PointOut, + overlay_type OverlayType +> +struct pointlike_linear_point + < + MultiPoint, Segment, PointOut, OverlayType, multi_point_tag, segment_tag + > : detail::overlay::multipoint_segment_point + < + MultiPoint, Segment, PointOut, OverlayType, + detail::not_ + > +{}; + + +}} // namespace detail_dispatch::overlay +#endif // DOXYGEN_NO_DISPATCH + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_LINEAR_HPP diff --git a/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp b/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp index 0af062d27..3e0641329 100644 --- a/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp @@ -1,6 +1,6 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) -// Copyright (c) 2014, Oracle and/or its affiliates. +// Copyright (c) 2014-2015, Oracle and/or its affiliates. // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html @@ -264,7 +264,7 @@ struct multipoint_multipoint_point >::apply(multipoint2, multipoint1, robust_policy, oit, strategy); } - std::vector::type> + std::vector::type> points2(boost::begin(multipoint2), boost::end(multipoint2)); std::sort(points2.begin(), points2.end(), detail::relate::less()); From a4b062583ce6a28dcf91306023043f63b4d59e91 Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Tue, 10 Mar 2015 16:46:28 +0200 Subject: [PATCH 2/4] [test][algorithms][set operations] add unit tests for intersection and difference for pointlike/linear geometries --- .../difference/difference_pl_l.cpp | 674 +++++++++++++++++ .../intersection/intersection_pl_l.cpp | 702 ++++++++++++++++++ 2 files changed, 1376 insertions(+) create mode 100644 test/algorithms/set_operations/difference/difference_pl_l.cpp create mode 100644 test/algorithms/set_operations/intersection/intersection_pl_l.cpp diff --git a/test/algorithms/set_operations/difference/difference_pl_l.cpp b/test/algorithms/set_operations/difference/difference_pl_l.cpp new file mode 100644 index 000000000..9592ec56d --- /dev/null +++ b/test/algorithms/set_operations/difference/difference_pl_l.cpp @@ -0,0 +1,674 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2015, 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_TEST_MODULE +#define BOOST_TEST_MODULE test_difference_pointlike_linear +#endif + +#include +#include + +#include + +#include "../test_set_ops_pointlike.hpp" + +#include +#include +#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_point multi_point_type; +typedef bg::model::multi_linestring multi_linestring_type; + + +//=========================================================================== +//=========================================================================== +//=========================================================================== + + +BOOST_AUTO_TEST_CASE( test_difference_point_segment ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << "size of std::size_t: " << sizeof(std::size_t) << std::endl; + std::cout << "size of range_iterator: " + << sizeof(boost::range_iterator::type) + << std::endl; + std::cout << "size of range_iterator: " + << sizeof(boost::range_iterator::type) + << std::endl; + std::cout << "size of point_iterator: " + << sizeof(bg::point_iterator) << std::endl; + std::cout << "size of point_iterator: " + << sizeof(bg::point_iterator) << std::endl; + std::cout << "size of point_iterator: " + << sizeof(bg::point_iterator) << std::endl; + std::cout << "size of segment_iterator: " + << sizeof(bg::segment_iterator) << std::endl; + std::cout << "size of segment_iterator: " + << sizeof(bg::segment_iterator) << std::endl; + + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / SEGMENT DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef segment_type S; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, S, MP, bg::overlay_difference + > tester; + + tester::apply + ("psdf01", + from_wkt

("POINT(0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("psdf02", + from_wkt

("POINT(0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("psdf03", + from_wkt

("POINT(1 1)"), + from_wkt("SEGMENT(0 0,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("psdf04", + from_wkt

("POINT(3 3)"), + from_wkt("SEGMENT(0 0,2 2)"), + from_wkt("MULTIPOINT(3 3)") + ); +} + + +BOOST_AUTO_TEST_CASE( test_difference_point_linestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / LINESTRING DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef linestring_type L; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, L, MP, bg::overlay_difference + > tester; + + tester::apply + ("pldf01", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pldf02", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pldf03", + from_wkt

("POINT(1 1)"), + from_wkt("LINESTRING(0 0,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pldf04", + from_wkt

("POINT(3 3)"), + from_wkt("LINESTRING(0 0,2 2)"), + from_wkt("MULTIPOINT(3 3)") + ); + + // linestrings with more than two points + tester::apply + ("pldf05", + from_wkt

("POINT(1 1)"), + from_wkt("LINESTRING(0 0,1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pldf06", + from_wkt

("POINT(2 2)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pldf07", + from_wkt

("POINT(10 10)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT(10 10)") + ); + + tester::apply + ("pldf08", + from_wkt

("POINT(0 1)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT(0 1)") + ); + + tester::apply + ("pldf09", + from_wkt

("POINT(4 4)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pldf10", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT()") + ); +} + + +BOOST_AUTO_TEST_CASE( test_difference_point_multilinestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / MULTILINESTRING DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef multi_linestring_type ML; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, ML, MP, bg::overlay_difference + > tester; + + tester::apply + ("pmldf01", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((1 1,2 2))"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pmldf02", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((0 0,1 1))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf03", + from_wkt

("POINT(1 1)"), + from_wkt("MULTILINESTRING((0 0,2 2))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf04", + from_wkt

("POINT(3 3)"), + from_wkt("MULTILINESTRING((0 0,2 2))"), + from_wkt("MULTIPOINT(3 3)") + ); + + // linestrings with more than two points + tester::apply + ("pmldf05", + from_wkt

("POINT(1 1)"), + from_wkt("MULTILINESTRING((0 0,1 1,2 2))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf06", + from_wkt

("POINT(2 2)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf07", + from_wkt

("POINT(10 10)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(10 10)") + ); + + tester::apply + ("pmldf08", + from_wkt

("POINT(0 1)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 1)") + ); + + tester::apply + ("pmldf09", + from_wkt

("POINT(4 4)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf10", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + // multilinestrings with more than one linestring + tester::apply + ("pmldf11", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10,-10),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf12", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10 0,0 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf13", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmldf14", + from_wkt

("POINT(-20 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(-20 0)") + ); + + tester::apply + ("pmldf15", + from_wkt

("POINT(0 1)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 1)") + ); +} + + +BOOST_AUTO_TEST_CASE( test_difference_multipoint_segment ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / SEGMENT DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef segment_type S; + + typedef test_set_op_of_pointlike_geometries + < + MP, S, MP, bg::overlay_difference + > tester; + + tester::apply + ("mpsdf01", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("mpsdf02", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsdf03", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsdf04", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsdf05", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0,0 0,1 0)") + ); + + tester::apply + ("mpsf06", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("SEGMENT(1 0,2 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsdf07", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(0 0,1 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpsdf08", + from_wkt("MULTIPOINT()"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsdf09", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(-1 0,1 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpsdf10", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(1 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsdf11", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(-1 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsdf12", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0)") + ); + + tester::apply + ("mpsdf12a", + from_wkt("MULTIPOINT(0 0,2 0,0 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0)") + ); + + tester::apply + ("mpsdf12b", + from_wkt("MULTIPOINT(0 0,2 0,0 0,2 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0,2 0)") + ); + + tester::apply + ("mpsdf12c", + from_wkt("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,0 0,2 0,2 0)") + ); + + tester::apply + ("mpsdf13", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(2 0,2 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsdf14", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(0 0,0 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpsdf15", + from_wkt("MULTIPOINT()"), + from_wkt("SEGMENT(0 0,1 0)"), + from_wkt("MULTIPOINT()") + ); +} + + +BOOST_AUTO_TEST_CASE( test_difference_multipoint_linestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / LINESTRING DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef linestring_type L; + + typedef test_set_op_of_pointlike_geometries + < + MP, L, MP, bg::overlay_difference + > tester; + + tester::apply + ("mpldf01", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("LINESTRING(1 1,2 2,3 3,4 4,5 5)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("mpldf02", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpldf03", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpldf04", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpldf05", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT(0 0,0 0,1 0)") + ); + + tester::apply + ("mplf06", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("LINESTRING(1 0,2 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpldf07", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(0 0,1 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpldf08", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpldf09", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(-1 0,1 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpldf10", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(1 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpldf11", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(-1 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpldf12", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(3 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0)") + ); + + tester::apply + ("mpldf13", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(2 0,2 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpldf14", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(0 0,0 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpldf15", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING(0 0,1 0,2 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpldf16", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING()"), + from_wkt("MULTIPOINT()") + ); +} + + +BOOST_AUTO_TEST_CASE( test_difference_multipoint_multilinestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / MULTILINESTRING DIFFERENCE ***" << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef multi_linestring_type ML; + + typedef test_set_op_of_pointlike_geometries + < + MP, ML, MP, bg::overlay_difference + > tester; + + tester::apply + ("mpmldf01", + from_wkt("MULTIPOINT(0 0,1 0,2 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0,2 0)") + ); + + tester::apply + ("mpmldf02", + from_wkt("MULTIPOINT(2 2,3 3,0 0,0 0,2 2,1 1,1 1,1 0,1 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpmldf03", + from_wkt("MULTIPOINT(5 5,3 3,0 0,0 0,5 5,1 1,1 1,1 0,1 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(5 5,5 5,0 0,0 0)") + ); + + tester::apply + ("mpmldf04", + from_wkt("MULTIPOINT(0 0,1 1,1 0,1 1)"), + from_wkt("MULTILINESTRING((1 0,0 0,1 1,0 0))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmldf05", + from_wkt("MULTIPOINT(0 0,1 0,2 0,5 0)"), + from_wkt("MULTILINESTRING((0 1,0 0,1 2,1 0),\ + (0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmldf05a", + from_wkt("MULTIPOINT(0 0,1 0,6 0,7 0,2 0,5 0,7 0,8 0)"), + from_wkt("MULTILINESTRING((0 1,0 0,1 2,1 0),\ + (0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"), + from_wkt("MULTIPOINT(7 0,7 0,8 0,6 0)") + ); + + tester::apply + ("mpmldf06", + from_wkt("MULTIPOINT(0 0,1 1,1 0,1 1)"), + from_wkt("MULTILINESTRING(())"), + from_wkt("MULTIPOINT(0 0,1 1,1 0,1 1)") + ); + + tester::apply + ("mpmldf07", + from_wkt("MULTIPOINT()"), + from_wkt("MULTILINESTRING(())"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmldf08", + from_wkt("MULTIPOINT()"), + from_wkt("MULTILINESTRING((0 0,1 0),(9 0,10 0))"), + from_wkt("MULTIPOINT()") + ); +} diff --git a/test/algorithms/set_operations/intersection/intersection_pl_l.cpp b/test/algorithms/set_operations/intersection/intersection_pl_l.cpp new file mode 100644 index 000000000..fd4575f0b --- /dev/null +++ b/test/algorithms/set_operations/intersection/intersection_pl_l.cpp @@ -0,0 +1,702 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2015, 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_TEST_MODULE +#define BOOST_TEST_MODULE test_intersection_pointlike_linear +#endif + +#include +#include + +#include + +#include "../test_set_ops_pointlike.hpp" + +#include +#include +#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_point multi_point_type; +typedef bg::model::multi_linestring multi_linestring_type; + + +//=========================================================================== +//=========================================================================== +//=========================================================================== + + +BOOST_AUTO_TEST_CASE( test_intersection_point_segment ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / SEGMENT INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef segment_type S; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, S, MP, bg::overlay_intersection + > tester; + + tester::apply + ("psi01", + from_wkt

("POINT(0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("psi02", + from_wkt

("POINT(0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("psi03", + from_wkt

("POINT(1 1)"), + from_wkt("SEGMENT(0 0,2 2)"), + from_wkt("MULTIPOINT(1 1)") + ); + + tester::apply + ("psi04", + from_wkt

("POINT(3 3)"), + from_wkt("SEGMENT(0 0,2 2)"), + from_wkt("MULTIPOINT()") + ); +} + + +BOOST_AUTO_TEST_CASE( test_intersection_point_linestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / LINESTRING INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef linestring_type L; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, L, MP, bg::overlay_intersection + > tester; + + tester::apply + ("pli01", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pli02", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pli03", + from_wkt

("POINT(1 1)"), + from_wkt("LINESTRING(0 0,2 2)"), + from_wkt("MULTIPOINT(1 1)") + ); + + tester::apply + ("pli04", + from_wkt

("POINT(3 3)"), + from_wkt("LINESTRING(0 0,2 2)"), + from_wkt("MULTIPOINT()") + ); + + // linestrings with more than two points + tester::apply + ("pli05", + from_wkt

("POINT(1 1)"), + from_wkt("LINESTRING(0 0,1 1,2 2)"), + from_wkt("MULTIPOINT(1 1)") + ); + + tester::apply + ("pli06", + from_wkt

("POINT(2 2)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT(2 2)") + ); + + tester::apply + ("pli07", + from_wkt

("POINT(10 10)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pli08", + from_wkt

("POINT(0 1)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pli09", + from_wkt

("POINT(4 4)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT(4 4)") + ); + + tester::apply + ("pli10", + from_wkt

("POINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1,4 4)"), + from_wkt("MULTIPOINT(0 0)") + ); +} + + +BOOST_AUTO_TEST_CASE( test_intersection_point_multilinestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** POINT / MULTILINESTRING INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef point_type P; + typedef multi_linestring_type ML; + typedef multi_point_type MP; + + typedef test_set_op_of_pointlike_geometries + < + P, ML, MP, bg::overlay_intersection + > tester; + + tester::apply + ("pmli01", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((1 1,2 2))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmli02", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((0 0,1 1))"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pmli03", + from_wkt

("POINT(1 1)"), + from_wkt("MULTILINESTRING((0 0,2 2))"), + from_wkt("MULTIPOINT(1 1)") + ); + + tester::apply + ("pmli04", + from_wkt

("POINT(3 3)"), + from_wkt("MULTILINESTRING((0 0,2 2))"), + from_wkt("MULTIPOINT()") + ); + + // linestrings with more than two points + tester::apply + ("pmli05", + from_wkt

("POINT(1 1)"), + from_wkt("MULTILINESTRING((0 0,1 1,2 2))"), + from_wkt("MULTIPOINT(1 1)") + ); + + tester::apply + ("pmli06", + from_wkt

("POINT(2 2)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(2 2)") + ); + + tester::apply + ("pmli07", + from_wkt

("POINT(10 10)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmli08", + from_wkt

("POINT(0 1)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmli09", + from_wkt

("POINT(4 4)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(4 4)") + ); + + tester::apply + ("pmli10", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0)") + ); + + // multilinestrings with more than one linestring + tester::apply + ("pmli11", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10,-10),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pmli12", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10 0,0 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pmli13", + from_wkt

("POINT(0 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("pmli14", + from_wkt

("POINT(-20 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmli15", + from_wkt

("POINT(0 1)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("pmli16", + from_wkt

("POINT(1 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(-1 0,2 0,20 0))"), + from_wkt("MULTIPOINT(1 0)") + ); + + tester::apply + ("pmli17", + from_wkt

("POINT(1 0)"), + from_wkt("MULTILINESTRING((-10 0,10 0),(0 -1,0 2,0 4))"), + from_wkt("MULTIPOINT(1 0)") + ); +} + + +BOOST_AUTO_TEST_CASE( test_intersection_multipoint_segment ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / SEGMENT INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef segment_type S; + + typedef test_set_op_of_pointlike_geometries + < + MP, S, MP, bg::overlay_intersection + > tester; + + tester::apply + ("mpsi01", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi02", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("mpsi03", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi04", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsi05", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("SEGMENT(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsf06", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("SEGMENT(1 0,2 0)"), + from_wkt("MULTIPOINT(1 0)") + ); + + tester::apply + ("mpsi07", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(0 0,1 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsi07a", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(0 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0)") + ); + + tester::apply + ("mpsi08", + from_wkt("MULTIPOINT()"), + from_wkt("SEGMENT(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi09", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(-1 0,1 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsi10", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(1 0,3 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpsi11", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(-1 0,3 0)"), + from_wkt("MULTIPOINT(0 0,0 0,2 0)") + ); + + tester::apply + ("mpsi12", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi12a", + from_wkt("MULTIPOINT(0 0,2 0,0 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi12b", + from_wkt("MULTIPOINT(0 0,2 0,0 0,2 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi12c", + from_wkt("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"), + from_wkt("SEGMENT(3 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi13", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(2 0,2 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpsi14", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("SEGMENT(0 0,0 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpsi15", + from_wkt("MULTIPOINT()"), + from_wkt("SEGMENT(0 0,1 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpsi16", + from_wkt("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"), + from_wkt("SEGMENT(-1 0,10 0)"), + from_wkt("MULTIPOINT(0 0,0 0,0 0,2 0,2 0)") + ); +} + + +BOOST_AUTO_TEST_CASE( test_intersection_multipoint_linestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / LINESTRING INTERSECTION ***" << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef linestring_type L; + + typedef test_set_op_of_pointlike_geometries + < + MP, L, MP, bg::overlay_intersection + > tester; + + tester::apply + ("mpli01", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("LINESTRING(1 1,2 2,3 3,4 4,5 5)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli02", + from_wkt("MULTIPOINT(0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0)") + ); + + tester::apply + ("mpli03", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli04", + from_wkt("MULTIPOINT(0 0,0 0)"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpli05", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("LINESTRING(1 1,2 2)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli06", + from_wkt("MULTIPOINT(0 0,0 0,1 0)"), + from_wkt("LINESTRING(1 0,2 0)"), + from_wkt("MULTIPOINT(1 0)") + ); + + tester::apply + ("mpli07", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(0 0,1 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpli08", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING(0 0,1 1)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli09", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(-1 0,1 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpli10", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(1 0,3 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpli10a", + from_wkt("MULTIPOINT(2 0,0 0,2 0,0 0,2 0)"), + from_wkt("LINESTRING(1 0,3 0)"), + from_wkt("MULTIPOINT(2 0,2 0,2 0)") + ); + + tester::apply + ("mpli11", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(-1 0,3 0)"), + from_wkt("MULTIPOINT(2 0,0 0,0 0)") + ); + + tester::apply + ("mpli12", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(3 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli13", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(2 0,2 0)"), + from_wkt("MULTIPOINT(2 0)") + ); + + tester::apply + ("mpli14", + from_wkt("MULTIPOINT(0 0,0 0,2 0)"), + from_wkt("LINESTRING(0 0,0 0)"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); + + tester::apply + ("mpli15", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING(0 0,1 0,2 0,3 0)"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpli16", + from_wkt("MULTIPOINT()"), + from_wkt("LINESTRING()"), + from_wkt("MULTIPOINT()") + ); +} + + +BOOST_AUTO_TEST_CASE( test_intersection_multipoint_multilinestring ) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << std::endl << std::endl << std::endl; + std::cout << "*** MULTIPOINT / MULTILINESTRING INTERSECTION ***" + << std::endl; + std::cout << std::endl; +#endif + + typedef multi_point_type MP; + typedef multi_linestring_type ML; + + typedef test_set_op_of_pointlike_geometries + < + MP, ML, MP, bg::overlay_intersection + > tester; + + tester::apply + ("mpmli01", + from_wkt("MULTIPOINT(0 0,1 0,2 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(1 0)") + ); + + tester::apply + ("mpmli02", + from_wkt("MULTIPOINT(2 2,3 3,0 0,0 0,2 2,1 1,1 1,1 0,1 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(2 2,2 2,3 3,1 1,1 1,1 0,1 0)") + ); + + tester::apply + ("mpmli03", + from_wkt("MULTIPOINT(5 5,3 3,0 0,0 0,5 5,1 1,1 1,1 0,1 0)"), + from_wkt("MULTILINESTRING((1 0,1 1,1 1,4 4))"), + from_wkt("MULTIPOINT(1 0,1 0,3 3,1 1,1 1)") + ); + + tester::apply + ("mpmli04", + from_wkt("MULTIPOINT(0 0,1 1,1 0,1 1)"), + from_wkt("MULTILINESTRING((1 0,0 0,1 1,0 0))"), + from_wkt("MULTIPOINT(1 0,0 0,1 1,1 1)") + ); + + tester::apply + ("mpmli05", + from_wkt("MULTIPOINT(0 0,1 0,2 0,5 0)"), + from_wkt("MULTILINESTRING((0 1,0 0,1 2,1 0),\ + (0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"), + from_wkt("MULTIPOINT(0 0,1 0,2 0,5 0)") + ); + + tester::apply + ("mpmli06", + from_wkt("MULTIPOINT(0 0,1 1,1 0,1 1)"), + from_wkt("MULTILINESTRING(())"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmli07", + from_wkt("MULTIPOINT()"), + from_wkt("MULTILINESTRING(())"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmli08", + from_wkt("MULTIPOINT()"), + from_wkt("MULTILINESTRING((0 0,1 0),(9 0,10 0))"), + from_wkt("MULTIPOINT()") + ); + + tester::apply + ("mpmli09", + from_wkt("MULTIPOINT(0 0,1 1,0 0,0 0,0 0,0 0,0 0,0 0,\ + 0 0,0 0,0 0,0 0,0 0)"), + from_wkt("MULTILINESTRING((0 0,0 1),(0 0,2 0),(0 0,0 3),\ + (0 0,4 0),(0 0,0 5),(0 0,6 0),(0 0,7 0),(0 0,8 0))"), + from_wkt("MULTIPOINT(0 0,0 0,0 0,0 0,0 0,0 0,0 0,\ + 0 0,0 0,0 0,0 0,0 0)") + ); + + tester::apply + ("mpmli09a", + from_wkt("MULTIPOINT(0 0,1 1,0 0)"), + from_wkt("MULTILINESTRING((0 0,0 1),(0 0,2 0),(0 0,0 3),\ + (0 0,4 0),(0 0,0 5),(0 0,6 0),(0 0,7 0),(0 0,8 0))"), + from_wkt("MULTIPOINT(0 0,0 0)") + ); +} From 9c860772fff0275bb5836fe937500003d595c40e Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Tue, 10 Mar 2015 16:52:14 +0200 Subject: [PATCH 3/4] [test][algorithms][set operations] update Jamfiles with the new unit tests --- test/algorithms/set_operations/difference/Jamfile.v2 | 11 ++++++----- .../algorithms/set_operations/intersection/Jamfile.v2 | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/test/algorithms/set_operations/difference/Jamfile.v2 b/test/algorithms/set_operations/difference/Jamfile.v2 index 2903d9cc5..bead4559e 100644 --- a/test/algorithms/set_operations/difference/Jamfile.v2 +++ b/test/algorithms/set_operations/difference/Jamfile.v2 @@ -1,11 +1,11 @@ # Boost.Geometry (aka GGL, Generic Geometry Library) # -# Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. -# Copyright (c) 2008-2014 Bruno Lalande, Paris, France. -# Copyright (c) 2009-2014 Mateusz Loskot, London, UK. +# Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. +# Copyright (c) 2008-2015 Bruno Lalande, Paris, France. +# Copyright (c) 2009-2015 Mateusz Loskot, London, UK. # -# This file was modified by Oracle on 2014. -# Modifications copyright (c) 2014, Oracle and/or its affiliates. +# This file was modified by Oracle on 2014, 2015. +# Modifications copyright (c) 2014-2015, 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 @@ -18,6 +18,7 @@ test-suite boost-geometry-algorithms-difference : [ run difference.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] [ run difference_linear_linear.cpp ] + [ run difference_pl_l.cpp ] [ run difference_pl_pl.cpp ] [ run multi_difference.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] [ run multi_difference_spike.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] diff --git a/test/algorithms/set_operations/intersection/Jamfile.v2 b/test/algorithms/set_operations/intersection/Jamfile.v2 index c039b1664..e66bfb166 100644 --- a/test/algorithms/set_operations/intersection/Jamfile.v2 +++ b/test/algorithms/set_operations/intersection/Jamfile.v2 @@ -1,11 +1,11 @@ # Boost.Geometry (aka GGL, Generic Geometry Library) # -# Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. -# Copyright (c) 2008-2014 Bruno Lalande, Paris, France. -# Copyright (c) 2009-2014 Mateusz Loskot, London, UK. +# Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. +# Copyright (c) 2008-2015 Bruno Lalande, Paris, France. +# Copyright (c) 2009-2015 Mateusz Loskot, London, UK. # -# This file was modified by Oracle on 2014. -# Modifications copyright (c) 2014, Oracle and/or its affiliates. +# This file was modified by Oracle on 2014, 2015. +# Modifications copyright (c) 2014-2015, 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 @@ -18,6 +18,7 @@ test-suite boost-geometry-algorithms-intersection : [ run intersection.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] [ run intersection_linear_linear.cpp ] + [ run intersection_pl_l.cpp ] [ run intersection_pl_pl.cpp ] [ run multi_intersection.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] ; From 07b96a8f9e6a605e9cfe9d6e89a620e87dcf6e4b Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Thu, 23 Apr 2015 10:15:24 +0300 Subject: [PATCH 4/4] [algorithms][overlay P/L] replace detail::disjoint::disjoint_point_segment by detail::disjoint::reverse_covered_by --- .../geometry/algorithms/detail/overlay/pointlike_linear.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp b/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp index ad8756473..bb42b4232 100644 --- a/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp @@ -293,7 +293,7 @@ struct pointlike_linear_point > : detail::overlay::point_linear_point < Point, Segment, PointOut, OverlayType, - detail::not_ + detail::not_ > {}; @@ -311,7 +311,7 @@ struct pointlike_linear_point > : detail::overlay::multipoint_linear_point < MultiPoint, Linear, PointOut, OverlayType, - detail::not_ + detail::not_ > {}; @@ -329,7 +329,7 @@ struct pointlike_linear_point > : detail::overlay::multipoint_segment_point < MultiPoint, Segment, PointOut, OverlayType, - detail::not_ + detail::not_ > {};