diff --git a/include/boost/geometry/algorithms/correct.hpp b/include/boost/geometry/algorithms/correct.hpp index 5c94a1dd5..7be0df6db 100644 --- a/include/boost/geometry/algorithms/correct.hpp +++ b/include/boost/geometry/algorithms/correct.hpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -36,6 +37,13 @@ namespace boost { namespace geometry namespace detail { namespace correct { +template +struct correct_nop +{ + static inline void apply(Geometry& ) + {} +}; + template struct correct_box_loop @@ -172,12 +180,29 @@ namespace dispatch template struct correct { - static inline void apply(Geometry& geometry) - { - // Default: no action necessary - } + BOOST_MPL_ASSERT_MSG + ( + false, NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE + , (types) + ); }; +template +struct correct + : detail::correct::correct_nop +{}; + +template +struct correct + : detail::correct::correct_nop +{}; + +template +struct correct + : detail::correct::correct_nop +{}; + + template struct correct : detail::correct::correct_box diff --git a/include/boost/geometry/algorithms/detail/overlay/assemble.hpp b/include/boost/geometry/algorithms/detail/overlay/assemble.hpp index 3c8c44c18..5e79cd17e 100644 --- a/include/boost/geometry/algorithms/detail/overlay/assemble.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/assemble.hpp @@ -17,18 +17,18 @@ #include -#include -#include -#include #include - -#include - - -#include #include +#include +#include +#include +#include +//#include #include +#include +#include +#include #include #include @@ -36,18 +36,16 @@ #include #include -#include - #include #include - #include #ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE # include #endif + namespace boost { namespace geometry { @@ -625,7 +623,7 @@ inline OutputIterator add_all_rings(Container& container, template < - typename GeometryOut, + typename GeometryOut, typename Rings, typename Map, typename Geometry1, typename Geometry2, typename OutputIterator @@ -764,7 +762,7 @@ template < typename Geometry1, typename Geometry2, typename OutputIterator, typename GeometryOut, - int Direction, + int Direction, bool ClockWise, typename Strategy > struct overlay @@ -815,6 +813,11 @@ std::cout << "get turns" << std::endl; detail::overlay::calculate_distance_policy >(geometry1, geometry2, turn_points, policy); + if (! ClockWise) + { + detail::overlay::reverse_operations(turn_points); + } + #ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE std::cout << "enrich" << std::endl; #endif @@ -847,4 +850,5 @@ std::cout << "traverse" << std::endl; }} // namespace boost::geometry + #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_ASSEMBLE_HPP diff --git a/include/boost/geometry/algorithms/detail/overlay/get_relative_order.hpp b/include/boost/geometry/algorithms/detail/overlay/get_relative_order.hpp index f263c1a29..84797e6b3 100644 --- a/include/boost/geometry/algorithms/detail/overlay/get_relative_order.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/get_relative_order.hpp @@ -11,6 +11,8 @@ #include +#include + namespace boost { namespace geometry { diff --git a/include/boost/geometry/algorithms/detail/overlay/reverse_operations.hpp b/include/boost/geometry/algorithms/detail/overlay/reverse_operations.hpp new file mode 100644 index 000000000..60518ca8e --- /dev/null +++ b/include/boost/geometry/algorithms/detail/overlay/reverse_operations.hpp @@ -0,0 +1,52 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands. +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_REVERSE_OPERATIONS_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_REVERSE_OPERATIONS_HPP + + +#include +#include + +#include + + +namespace boost { namespace geometry +{ + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace overlay +{ + + +template +void reverse_operations(Turns& turns) +{ + for(typename boost::range_iterator::type it + = boost::begin(turns); it != boost::end(turns); ++it) + { + for (unsigned int i = 0; i < it->operations.size(); i++) + { + operation_type& op = it->operations[i].operation; + switch(op) + { + case operation_union : op = operation_intersection; break; + case operation_intersection : op = operation_union; break; + } + } + } +} + + +}} // namespace detail::overlay +#endif //DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_REVERSE_OPERATIONS_HPP diff --git a/include/boost/geometry/algorithms/intersection.hpp b/include/boost/geometry/algorithms/intersection.hpp index a5c69be35..d92578a06 100644 --- a/include/boost/geometry/algorithms/intersection.hpp +++ b/include/boost/geometry/algorithms/intersection.hpp @@ -115,6 +115,8 @@ template < // tag dispatching: typename TagIn1, typename TagIn2, typename TagOut, + // orientation + order_selector Order1, order_selector Order2, order_selector OrderOut, // metafunction finetuning helpers: bool Areal1, bool Areal2, bool ArealOut, // real types @@ -144,14 +146,34 @@ template struct intersection_inserter < TagIn1, TagIn2, TagOut, + clockwise, clockwise, clockwise, true, true, true, Geometry1, Geometry2, OutputIterator, GeometryOut, Strategy > : detail::overlay::overlay - + {}; +template +< + typename TagIn1, typename TagIn2, typename TagOut, + typename Geometry1, typename Geometry2, + typename OutputIterator, + typename GeometryOut, + typename Strategy +> +struct intersection_inserter + < + TagIn1, TagIn2, TagOut, + counterclockwise, counterclockwise, counterclockwise, + true, true, true, + Geometry1, Geometry2, + OutputIterator, GeometryOut, + Strategy + > : detail::overlay::overlay + +{}; template @@ -163,6 +185,7 @@ template struct intersection_inserter < segment_tag, segment_tag, point_tag, + clockwise, clockwise, clockwise, false, false, false, Segment1, Segment2, OutputIterator, GeometryOut, @@ -185,6 +208,7 @@ template struct intersection_inserter < linestring_tag, linestring_tag, point_tag, + clockwise, clockwise, clockwise, false, false, false, Linestring1, Linestring2, OutputIterator, GeometryOut, @@ -207,6 +231,7 @@ template struct intersection_inserter < linestring_tag, box_tag, linestring_tag, + clockwise, clockwise, clockwise, false, true, false, Linestring, Box, OutputIterator, GeometryOut, @@ -232,6 +257,7 @@ template struct intersection_inserter < segment_tag, box_tag, linestring_tag, + clockwise, clockwise, clockwise, false, true, false, Segment, Box, OutputIterator, GeometryOut, @@ -255,6 +281,7 @@ struct intersection_inserter template < typename GeometryTag1, typename GeometryTag2, typename GeometryTag3, + order_selector Order1, order_selector Order2, order_selector OrderOut, bool Areal1, bool Areal2, bool ArealOut, typename Geometry1, typename Geometry2, typename OutputIterator, typename GeometryOut, @@ -269,6 +296,7 @@ struct intersection_inserter_reversed return intersection_inserter < GeometryTag2, GeometryTag1, GeometryTag3, + Order2, Order1, OrderOut, Areal2, Areal1, ArealOut, Geometry2, Geometry1, OutputIterator, GeometryOut, @@ -327,6 +355,9 @@ inline OutputIterator intersection_inserter(Geometry1 const& geometry1, typename tag::type, typename tag::type, typename tag::type, + point_order::value, + point_order::value, + point_order::value, is_areal::value, is_areal::value, is_areal::value, @@ -340,6 +371,9 @@ inline OutputIterator intersection_inserter(Geometry1 const& geometry1, typename tag::type, typename tag::type, typename tag::type, + point_order::value, + point_order::value, + point_order::value, is_areal::value, is_areal::value, is_areal::value, diff --git a/include/boost/geometry/algorithms/union.hpp b/include/boost/geometry/algorithms/union.hpp index 5b95778a2..9cec6cbdb 100644 --- a/include/boost/geometry/algorithms/union.hpp +++ b/include/boost/geometry/algorithms/union.hpp @@ -38,7 +38,7 @@ template > struct union_inserter : detail::overlay::overlay - + { }; diff --git a/include/boost/geometry/multi/algorithms/correct.hpp b/include/boost/geometry/multi/algorithms/correct.hpp index 6fb30a86b..ab78b50c6 100644 --- a/include/boost/geometry/multi/algorithms/correct.hpp +++ b/include/boost/geometry/multi/algorithms/correct.hpp @@ -18,16 +18,26 @@ #include - namespace boost { namespace geometry { - #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { +template +struct correct + : detail::correct::correct_nop +{}; + + +template +struct correct + : detail::correct::correct_nop +{}; + + template struct correct : detail::multi_modify diff --git a/include/boost/geometry/multi/algorithms/intersection.hpp b/include/boost/geometry/multi/algorithms/intersection.hpp index 203dcf345..64dd2ca7b 100644 --- a/include/boost/geometry/multi/algorithms/intersection.hpp +++ b/include/boost/geometry/multi/algorithms/intersection.hpp @@ -11,6 +11,7 @@ #include #include +#include #include @@ -119,6 +120,7 @@ template struct intersection_inserter < multi_linestring_tag, multi_linestring_tag, point_tag, + clockwise, clockwise, clockwise, false, false, false, MultiLinestring1, MultiLinestring2, OutputIterator, GeometryOut, @@ -140,6 +142,7 @@ template struct intersection_inserter < linestring_tag, multi_linestring_tag, point_tag, + clockwise, clockwise, clockwise, false, false, false, Linestring, MultiLinestring, OutputIterator, GeometryOut, diff --git a/include/boost/geometry/multi/core/point_order.hpp b/include/boost/geometry/multi/core/point_order.hpp new file mode 100644 index 000000000..7a051422a --- /dev/null +++ b/include/boost/geometry/multi/core/point_order.hpp @@ -0,0 +1,43 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands. +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_GEOMETRY_MULTI_CORE_POINT_ORDER_HPP +#define BOOST_GEOMETRY_MULTI_CORE_POINT_ORDER_HPP + + +#include + +#include +#include +#include + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DISPATCH +namespace core_dispatch +{ + +// Specialization for multi_polygon: the order is the order of its polygons +template +struct point_order +{ + static const order_selector value = core_dispatch::point_order + < + polygon_tag, + typename boost::range_value::type + >::value ; +}; + +} // namespace core_dispatch +#endif // DOXYGEN_NO_DISPATCH + + +}} // namespace boost::geometry + +#endif // BOOST_GEOMETRY_MULTI_CORE_POINT_ORDER_HPP diff --git a/test/algorithms/intersection.cpp b/test/algorithms/intersection.cpp index 68f610214..6a9d4d3a0 100644 --- a/test/algorithms/intersection.cpp +++ b/test/algorithms/intersection.cpp @@ -20,6 +20,133 @@ #include +template +void test_polygons() +{ + test_one("simplex_normal", + simplex_normal[0], simplex_normal[1], + 1, 7, 5.47363293); + test_one("star_ring", example_star, example_ring, + 1, 18, 2.80983); + + test_one("star_poly", example_star, example_polygon, + 1, 0, // CLN: 23 points, other types: 22 point (one is merged) + 2.5020508); + test_one("first_within_second1", + first_within_second[0], first_within_second[1], + 1, 5, 1.0); + + test_one("first_within_second2", + first_within_second[1], first_within_second[0], + 1, 5, 1.0); + + test_one("first_within_hole_of_second", + first_within_hole_of_second[0], first_within_hole_of_second[1], + 0, 0, 0.0); + + // Two forming new hole + test_one("new_hole", + new_hole[0], new_hole[1], + 2, 10, 2.0); + + // Two identical + test_one("identical", + identical[0], identical[1], + 1, 5, 1.0); + + // Two, inside each other, having intersections but holes are disjoint + test_one("intersect_holes_disjoint", + intersect_holes_disjoint[0], intersect_holes_disjoint[1], + 1, 15, 18.0); + + // Two, inside each other, having intersections; holes separate intersections + test_one("intersect_holes_intersect", + intersect_holes_intersect[0], intersect_holes_intersect[1], + 1, 14, 18.25); + + test_one("intersect_holes_intersect_and_disjoint", + intersect_holes_intersect_and_disjoint[0], intersect_holes_intersect_and_disjoint[1], + 1, 19, 17.25); + + test_one("intersect_holes_intersect_and_touch", + intersect_holes_intersect_and_touch[0], intersect_holes_intersect_and_touch[1], + 1, 23, 17.25); + + test_one("intersect_holes_new_ring", + intersect_holes_new_ring[0], intersect_holes_new_ring[1], + 2, 23, 122.1039); + + test_one("winded", + winded[0], winded[1], + 1, 22, 40.0); + + test_one("two_bends", + two_bends[0], two_bends[1], + 1, 7, 24.0); + + test_one("star_comb_15", + star_15, comb_15, + 28, 150, 189.952883); + + test_one("simplex_normal", + simplex_normal[0], simplex_normal[1], + 1, 7, 5.47363293); + + test_one("fitting", + fitting[0], fitting[1], + 0, 0, 0); + + test_one("dist_zero", + distance_zero[0], distance_zero[1], + 1, 0 /* f: 4, other: 5 */, 0.29516139, 0.01); + + test_one("ehd", + equal_holes_disjoint[0], equal_holes_disjoint[1], + 1, 20, 81 - 2 * 3 * 3 - 3 * 7); + + test_one("only_hole_intersections1", + only_hole_intersections[0], only_hole_intersections[1], + 1, 21, 178.090909); + test_one("only_hole_intersection2", + only_hole_intersections[0], only_hole_intersections[2], + 1, 21, 149.090909); + + test_one("intersect_exterior_and_interiors_winded", + intersect_exterior_and_interiors_winded[0], intersect_exterior_and_interiors_winded[1], + 1, 14, 25.2166667); + + return; + + + test_one( + "polygon_pseudo_line", + "Polygon((0 0,0 4,4 4,4 0,0 0))", + "Polygon((2 -2,2 -1,2 6,2 -2))", + 5, 22, 1.1901714); + + + // Icovist (submitted by Brandon during Formal Review) + // Test the FORWARD case + { + std::string tn = string_from_type::type>::name(); + test_one("isovist", + isovist[0], isovist[1], + 1, + tn == std::string("f") ? 19 : tn == std::string("d") ? 21 : 20, + 88.19203, + tn == std::string("f") ? 0.5 : tn == std::string("d") ? 0.1 : 0.01); + } + + + // Test the REVERSE case - does not give correct results yet + /* + test_one("icovist_r", + isovist[0], isovist[2], + 1, 4, 0.29516139, 0.01); + */ + +} + template void test_all() @@ -31,9 +158,11 @@ void test_all() std::string clip = "box(2 2,8 8)"; - test_one("simplex_normal", - simplex_normal[0], simplex_normal[1], - 1, 7, 5.47363293); + // Test clockwise polygons + test_polygons(); + + // Test counter-clockwise polygons + test_polygons >(); // Basic check: box/linestring, is clipping OK? should compile in any order @@ -68,12 +197,6 @@ void test_all() test_one("boxpoly", example_box, example_polygon, 3, 19, 0.840166); - test_one("star_ring", example_star, example_ring, - 1, 18, 2.80983); - - test_one("star_poly", example_star, example_polygon, - 1, 0, // CLN: 23 points, other types: 22 point (one is merged) - 2.5020508); test_one("poly1", example_box, @@ -101,88 +224,6 @@ void test_all() test_one("clip_poly7", "box(0 0, 3 3)", "POLYGON((2 2, 1 4, 2 4, 3 3, 2 2))", 1, 4, 0.75); - test_one("first_within_second1", - first_within_second[0], first_within_second[1], - 1, 5, 1.0); - - test_one("first_within_second2", - first_within_second[1], first_within_second[0], - 1, 5, 1.0); - - test_one("first_within_hole_of_second", - first_within_hole_of_second[0], first_within_hole_of_second[1], - 0, 0, 0.0); - - // Two forming new hole - test_one("new_hole", - new_hole[0], new_hole[1], - 2, 10, 2.0); - - // Two identical - test_one("identical", - identical[0], identical[1], - 1, 5, 1.0); - - // Two, inside each other, having intersections but holes are disjoint - test_one("intersect_holes_disjoint", - intersect_holes_disjoint[0], intersect_holes_disjoint[1], - 1, 15, 18.0); - - // Two, inside each other, having intersections; holes separate intersections - test_one("intersect_holes_intersect", - intersect_holes_intersect[0], intersect_holes_intersect[1], - 1, 14, 18.25); - - test_one("intersect_holes_intersect_and_disjoint", - intersect_holes_intersect_and_disjoint[0], intersect_holes_intersect_and_disjoint[1], - 1, 19, 17.25); - - test_one("intersect_holes_intersect_and_touch", - intersect_holes_intersect_and_touch[0], intersect_holes_intersect_and_touch[1], - 1, 23, 17.25); - - test_one("intersect_holes_new_ring", - intersect_holes_new_ring[0], intersect_holes_new_ring[1], - 2, 23, 122.1039); - - test_one("winded", - winded[0], winded[1], - 1, 22, 40.0); - - test_one("two_bends", - two_bends[0], two_bends[1], - 1, 7, 24.0); - - test_one("star_comb_15", - star_15, comb_15, - 28, 150, 189.952883); - - test_one("simplex_normal", - simplex_normal[0], simplex_normal[1], - 1, 7, 5.47363293); - - test_one("fitting", - fitting[0], fitting[1], - 0, 0, 0); - - test_one("dist_zero", - distance_zero[0], distance_zero[1], - 1, 0 /* f: 4, other: 5 */, 0.29516139, 0.01); - - test_one("ehd", - equal_holes_disjoint[0], equal_holes_disjoint[1], - 1, 20, 81 - 2 * 3 * 3 - 3 * 7); - - test_one("only_hole_intersections1", - only_hole_intersections[0], only_hole_intersections[1], - 1, 21, 178.090909); - test_one("only_hole_intersection2", - only_hole_intersections[0], only_hole_intersections[2], - 1, 21, 149.090909); - - test_one("intersect_exterior_and_interiors_winded", - intersect_exterior_and_interiors_winded[0], intersect_exterior_and_interiors_winded[1], - 1, 14, 25.2166667); // linear test_one("llp1", "LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", 1, 1, 0); @@ -193,60 +234,6 @@ void test_all() //test_one("ppp1", simplex_normal[0], simplex_normal[1], 1, 7, 5.47363293); - return; - - - test_one( - "polygon_pseudo_line", - "POLYGON((0 0,0 4,4 4,4 0,0 0))", - "POLYGON((2 -2,2 -1,2 6,2 -2))", - 5, 22, 1.1901714); - - test_one( - "reverse", - "POLYGON((0 0,4 0,4 4,0 4,0 0))", - "POLYGON((2 2,2 3,6 3,6 2,2 2))", - 5, 22, 1.190171); - - - - - /* - REVERSED cases (should be handled/tested differently) - test_one(102, - simplex_normal[0], simplex_reversed[1], - 1, 7, 24.0); - - test_one(103, - simplex_reversed[0], simplex_normal[1], - 1, 7, 24.0); - - test_one(104, - simplex_reversed[0], simplex_reversed[1], - 1, 7, 24.0); - */ - - - // Icovist (submitted by Brandon during Formal Review) - // Test the FORWARD case - { - std::string tn = string_from_type::type>::name(); - test_one("isovist", - isovist[0], isovist[1], - 1, - tn == std::string("f") ? 19 : tn == std::string("d") ? 21 : 20, - 88.19203, - tn == std::string("f") ? 0.5 : tn == std::string("d") ? 0.1 : 0.01); - } - - - // Test the REVERSE case - does not give correct results yet - /* - test_one("icovist_r", - isovist[0], isovist[2], - 1, 4, 0.29516139, 0.01); - */ - /* test_one(99, "box(115041.10 471900.10, 118334.60 474523.40)", @@ -292,25 +279,12 @@ void test_pointer_version() -template -void test_ccw() -{ - typedef boost::geometry::polygon polygon; - - test_one("simplex_normal", - simplex_normal[0], simplex_normal[1], - 1, 7, 5.47363293); -} - int test_main(int, char* []) { test_all >(); test_all >(); - //test_ccw >(); - - #if defined(HAVE_CLN) test_all >(); #endif diff --git a/test/algorithms/overlay/ccw_traverse.cpp b/test/algorithms/overlay/ccw_traverse.cpp index 5dcc654c9..3e3cfc0ec 100644 --- a/test/algorithms/overlay/ccw_traverse.cpp +++ b/test/algorithms/overlay/ccw_traverse.cpp @@ -18,28 +18,6 @@ namespace bg = boost::geometry; -template -void reverse_operations(Vector& v) -{ - using namespace bg::detail::overlay; - - typedef typename boost::range_value::type item; - BOOST_FOREACH(item& it, v) - { - for (int i = 0; i < 2; i++) - { - operation_type& op = it.operations[i].operation; - switch(op) - { - case operation_none : op = operation_none; break; - case operation_union : op = operation_intersection; break; - case operation_intersection : op = operation_union; break; - case operation_blocked : op = operation_blocked; break; - case operation_continue : op = operation_continue; break; - } - } - } -} template inline typename bg::coordinate_type::type intersect(Geometry const& g1, Geometry const& g2, std::string const& name, @@ -63,7 +41,7 @@ inline typename bg::coordinate_type::type intersect(Geometry const& g1 bool const reverse = bg::point_order::value == bg::counterclockwise; if (reverse) { - reverse_operations(turns); + bg::detail::overlay::reverse_operations(turns); } bg::enrich_intersection_points(turns, g1, g2, side_strategy_type()); diff --git a/test/algorithms/overlay/overlay.sln b/test/algorithms/overlay/overlay.sln index 660e1fbb2..9c8b6f7e7 100644 --- a/test/algorithms/overlay/overlay.sln +++ b/test/algorithms/overlay/overlay.sln @@ -1,7 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enrich_intersection_points", "enrich_intersection_points.vcproj", "{20FE798A-E4EE-4C87-A988-7317E774D28A}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "traverse", "traverse.vcproj", "{6260214E-DB6F-4934-ADF7-DD2B1666171B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "self_intersection_points", "self_intersection_points.vcproj", "{06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}" @@ -14,8 +12,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relative_order", "relative_ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assemble", "assemble.vcproj", "{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "split_rings", "split_rings.vcproj", "{271231F9-F7DA-4218-8538-0E9DCD688D09}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dissolver", "dissolver.vcproj", "{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccw_traverse", "ccw_traverse.vcproj", "{BA789719-B2FC-405A-9258-E9E4ABCE1791}" @@ -26,10 +22,6 @@ Global Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {20FE798A-E4EE-4C87-A988-7317E774D28A}.Debug|Win32.ActiveCfg = Debug|Win32 - {20FE798A-E4EE-4C87-A988-7317E774D28A}.Debug|Win32.Build.0 = Debug|Win32 - {20FE798A-E4EE-4C87-A988-7317E774D28A}.Release|Win32.ActiveCfg = Release|Win32 - {20FE798A-E4EE-4C87-A988-7317E774D28A}.Release|Win32.Build.0 = Release|Win32 {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.ActiveCfg = Debug|Win32 {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.Build.0 = Debug|Win32 {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.ActiveCfg = Release|Win32 @@ -54,10 +46,6 @@ Global {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Debug|Win32.Build.0 = Debug|Win32 {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.ActiveCfg = Release|Win32 {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.Build.0 = Release|Win32 - {271231F9-F7DA-4218-8538-0E9DCD688D09}.Debug|Win32.ActiveCfg = Debug|Win32 - {271231F9-F7DA-4218-8538-0E9DCD688D09}.Debug|Win32.Build.0 = Debug|Win32 - {271231F9-F7DA-4218-8538-0E9DCD688D09}.Release|Win32.ActiveCfg = Release|Win32 - {271231F9-F7DA-4218-8538-0E9DCD688D09}.Release|Win32.Build.0 = Release|Win32 {6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Debug|Win32.ActiveCfg = Debug|Win32 {6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Debug|Win32.Build.0 = Debug|Win32 {6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/test/algorithms/test_intersection.hpp b/test/algorithms/test_intersection.hpp index 47cbad13d..d011e1966 100644 --- a/test/algorithms/test_intersection.hpp +++ b/test/algorithms/test_intersection.hpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -164,6 +165,10 @@ double test_one(std::string const& caseid, std::string const& wkt1, std::string G2 g2; boost::geometry::read_wkt(wkt2, g2); + // Reverse if necessary + boost::geometry::correct(g1); + boost::geometry::correct(g2); + return test_intersection(caseid, g1, g2, expected_count, expected_point_count, expected_length_or_area, percentage, make_unique); diff --git a/test/multi/algorithms/multi_intersection.cpp b/test/multi/algorithms/multi_intersection.cpp index a9fc12b74..7ca59cbab 100644 --- a/test/multi/algorithms/multi_intersection.cpp +++ b/test/multi/algorithms/multi_intersection.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -21,42 +22,52 @@ #include +template +void test_areal() +{ + test_one("simplex_multi", + case_multi_simplex[0], case_multi_simplex[1], + 2, 12, 6.42); + + test_one("case_multi_no_ip", + case_multi_no_ip[0], case_multi_no_ip[1], + 2, 8, 8.5); + test_one("case_multi_2", + case_multi_2[0], case_multi_2[1], + 3, 12, 5.9); + + test_one("simplex_multi_mp_p", + case_multi_simplex[0], case_single_simplex, + 2, 12, 6.42); + + test_one("simplex_multi_r_mp", + case_single_simplex, case_multi_simplex[0], + 2, 12, 6.42); + test_one("simplex_multi_mp_r", + case_multi_simplex[0], case_single_simplex, + 2, 12, 6.42); +} + template void test_all() { - // polygon/multi polygon and ring/multi polygon are tested in union - namespace bg = boost::geometry; + + typedef bg::linear_ring

ring; typedef bg::polygon

polygon; typedef bg::multi_polygon multi_polygon; + test_areal(); + + typedef bg::linear_ring ring_ccw; + typedef bg::polygon polygon_ccw; + typedef bg::multi_polygon multi_polygon_ccw; + test_areal(); typedef bg::linestring

linestring; typedef bg::multi_linestring multi_linestring; - test_one("simplex_multi", - case_multi_simplex[0], case_multi_simplex[1], - 2, 12, 6.42); - - test_one("case_multi_no_ip", - case_multi_no_ip[0], case_multi_no_ip[1], - 2, 8, 8.5); - test_one("case_multi_2", - case_multi_2[0], case_multi_2[1], - 3, 12, 5.9); - - test_one("simplex_multi_mp_p", - case_multi_simplex[0], case_single_simplex, - 2, 12, 6.42); - - test_one("simplex_multi_r_mp", - case_single_simplex, case_multi_simplex[0], - 2, 12, 6.42); - test_one("simplex_multi_mp_r", - case_multi_simplex[0], case_single_simplex, - 2, 12, 6.42); - // linear test_one("case_multi_linear_1",