mirror of
https://github.com/boostorg/geometry.git
synced 2025-05-12 05:51:47 +00:00
Finished ccw implementation of intersection
Added mpl assert for correct, if not implemented Restructured intersection.cpp unit test to support cw [SVN r65920]
This commit is contained in:
parent
7a844d9dec
commit
6564152e98
@ -14,6 +14,7 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
#include <boost/mpl/assert.hpp>
|
||||||
#include <boost/range.hpp>
|
#include <boost/range.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/core/closure.hpp>
|
#include <boost/geometry/core/closure.hpp>
|
||||||
@ -36,6 +37,13 @@ namespace boost { namespace geometry
|
|||||||
namespace detail { namespace correct
|
namespace detail { namespace correct
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template <typename Geometry>
|
||||||
|
struct correct_nop
|
||||||
|
{
|
||||||
|
static inline void apply(Geometry& )
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
template <typename Box, std::size_t Dimension, std::size_t DimensionCount>
|
template <typename Box, std::size_t Dimension, std::size_t DimensionCount>
|
||||||
struct correct_box_loop
|
struct correct_box_loop
|
||||||
@ -172,12 +180,29 @@ namespace dispatch
|
|||||||
template <typename Tag, typename Geometry>
|
template <typename Tag, typename Geometry>
|
||||||
struct correct
|
struct correct
|
||||||
{
|
{
|
||||||
static inline void apply(Geometry& geometry)
|
BOOST_MPL_ASSERT_MSG
|
||||||
{
|
(
|
||||||
// Default: no action necessary
|
false, NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
|
||||||
}
|
, (types<Geometry>)
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Point>
|
||||||
|
struct correct<point_tag, Point>
|
||||||
|
: detail::correct::correct_nop<Point>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <typename LineString>
|
||||||
|
struct correct<linestring_tag, LineString>
|
||||||
|
: detail::correct::correct_nop<LineString>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <typename Segment>
|
||||||
|
struct correct<segment_tag, Segment>
|
||||||
|
: detail::correct::correct_nop<Segment>
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
template <typename Box>
|
template <typename Box>
|
||||||
struct correct<box_tag, Box>
|
struct correct<box_tag, Box>
|
||||||
: detail::correct::correct_box<Box>
|
: detail::correct::correct_box<Box>
|
||||||
|
@ -17,18 +17,18 @@
|
|||||||
#include <boost/mpl/assert.hpp>
|
#include <boost/mpl/assert.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/calculate_distance_policy.hpp>
|
#include <boost/geometry/algorithms/detail/overlay/calculate_distance_policy.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/ring_properties.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
|
|
||||||
#include <boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>
|
#include <boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/ring_properties.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/reverse_operations.hpp>
|
||||||
|
//#include <boost/geometry/strategies/intersection_result.hpp>
|
||||||
#include <boost/geometry/algorithms/detail/overlay/traverse.hpp>
|
#include <boost/geometry/algorithms/detail/overlay/traverse.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
|
||||||
|
|
||||||
|
#include <boost/geometry/algorithms/detail/point_on_border.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/algorithms/convert.hpp>
|
#include <boost/geometry/algorithms/convert.hpp>
|
||||||
#include <boost/geometry/algorithms/combine.hpp>
|
#include <boost/geometry/algorithms/combine.hpp>
|
||||||
@ -36,18 +36,16 @@
|
|||||||
#include <boost/geometry/algorithms/num_points.hpp>
|
#include <boost/geometry/algorithms/num_points.hpp>
|
||||||
#include <boost/geometry/algorithms/within.hpp>
|
#include <boost/geometry/algorithms/within.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/algorithms/detail/point_on_border.hpp>
|
|
||||||
|
|
||||||
#include <boost/geometry/iterators/range_type.hpp>
|
#include <boost/geometry/iterators/range_type.hpp>
|
||||||
#include <boost/geometry/util/math.hpp>
|
#include <boost/geometry/util/math.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include <boost/geometry/strategies/intersection.hpp>
|
#include <boost/geometry/strategies/intersection.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE
|
#ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE
|
||||||
# include <boost/geometry/util/write_dsv.hpp>
|
# include <boost/geometry/util/write_dsv.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace boost { namespace geometry
|
namespace boost { namespace geometry
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -625,7 +623,7 @@ inline OutputIterator add_all_rings(Container& container,
|
|||||||
|
|
||||||
template
|
template
|
||||||
<
|
<
|
||||||
typename GeometryOut,
|
typename GeometryOut,
|
||||||
typename Rings, typename Map,
|
typename Rings, typename Map,
|
||||||
typename Geometry1, typename Geometry2,
|
typename Geometry1, typename Geometry2,
|
||||||
typename OutputIterator
|
typename OutputIterator
|
||||||
@ -764,7 +762,7 @@ template
|
|||||||
<
|
<
|
||||||
typename Geometry1, typename Geometry2,
|
typename Geometry1, typename Geometry2,
|
||||||
typename OutputIterator, typename GeometryOut,
|
typename OutputIterator, typename GeometryOut,
|
||||||
int Direction,
|
int Direction, bool ClockWise,
|
||||||
typename Strategy
|
typename Strategy
|
||||||
>
|
>
|
||||||
struct overlay
|
struct overlay
|
||||||
@ -815,6 +813,11 @@ std::cout << "get turns" << std::endl;
|
|||||||
detail::overlay::calculate_distance_policy
|
detail::overlay::calculate_distance_policy
|
||||||
>(geometry1, geometry2, turn_points, policy);
|
>(geometry1, geometry2, turn_points, policy);
|
||||||
|
|
||||||
|
if (! ClockWise)
|
||||||
|
{
|
||||||
|
detail::overlay::reverse_operations(turn_points);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE
|
#ifdef BOOST_GEOMETRY_DEBUG_ASSEMBLE
|
||||||
std::cout << "enrich" << std::endl;
|
std::cout << "enrich" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
@ -847,4 +850,5 @@ std::cout << "traverse" << std::endl;
|
|||||||
|
|
||||||
}} // namespace boost::geometry
|
}} // namespace boost::geometry
|
||||||
|
|
||||||
|
|
||||||
#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_ASSEMBLE_HPP
|
#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_ASSEMBLE_HPP
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#include <boost/geometry/algorithms/distance.hpp>
|
#include <boost/geometry/algorithms/distance.hpp>
|
||||||
|
|
||||||
|
#include <boost/geometry/strategies/intersection.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace boost { namespace geometry
|
namespace boost { namespace geometry
|
||||||
{
|
{
|
||||||
|
@ -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 <boost/range/functions.hpp>
|
||||||
|
#include <boost/range/metafunctions.hpp>
|
||||||
|
|
||||||
|
#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace boost { namespace geometry
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifndef DOXYGEN_NO_DETAIL
|
||||||
|
namespace detail { namespace overlay
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
template <typename Turns>
|
||||||
|
void reverse_operations(Turns& turns)
|
||||||
|
{
|
||||||
|
for(typename boost::range_iterator<Turns>::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
|
@ -115,6 +115,8 @@ template
|
|||||||
<
|
<
|
||||||
// tag dispatching:
|
// tag dispatching:
|
||||||
typename TagIn1, typename TagIn2, typename TagOut,
|
typename TagIn1, typename TagIn2, typename TagOut,
|
||||||
|
// orientation
|
||||||
|
order_selector Order1, order_selector Order2, order_selector OrderOut,
|
||||||
// metafunction finetuning helpers:
|
// metafunction finetuning helpers:
|
||||||
bool Areal1, bool Areal2, bool ArealOut,
|
bool Areal1, bool Areal2, bool ArealOut,
|
||||||
// real types
|
// real types
|
||||||
@ -144,14 +146,34 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
TagIn1, TagIn2, TagOut,
|
TagIn1, TagIn2, TagOut,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
true, true, true,
|
true, true, true,
|
||||||
Geometry1, Geometry2,
|
Geometry1, Geometry2,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
Strategy
|
Strategy
|
||||||
> : detail::overlay::overlay
|
> : detail::overlay::overlay
|
||||||
<Geometry1, Geometry2, OutputIterator, GeometryOut, -1, Strategy>
|
<Geometry1, Geometry2, OutputIterator, GeometryOut, -1, true, Strategy>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
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
|
||||||
|
<Geometry1, Geometry2, OutputIterator, GeometryOut, -1, false, Strategy>
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
template
|
template
|
||||||
@ -163,6 +185,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
segment_tag, segment_tag, point_tag,
|
segment_tag, segment_tag, point_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, false, false,
|
false, false, false,
|
||||||
Segment1, Segment2,
|
Segment1, Segment2,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -185,6 +208,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
linestring_tag, linestring_tag, point_tag,
|
linestring_tag, linestring_tag, point_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, false, false,
|
false, false, false,
|
||||||
Linestring1, Linestring2,
|
Linestring1, Linestring2,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -207,6 +231,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
linestring_tag, box_tag, linestring_tag,
|
linestring_tag, box_tag, linestring_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, true, false,
|
false, true, false,
|
||||||
Linestring, Box,
|
Linestring, Box,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -232,6 +257,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
segment_tag, box_tag, linestring_tag,
|
segment_tag, box_tag, linestring_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, true, false,
|
false, true, false,
|
||||||
Segment, Box,
|
Segment, Box,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -255,6 +281,7 @@ struct intersection_inserter
|
|||||||
template
|
template
|
||||||
<
|
<
|
||||||
typename GeometryTag1, typename GeometryTag2, typename GeometryTag3,
|
typename GeometryTag1, typename GeometryTag2, typename GeometryTag3,
|
||||||
|
order_selector Order1, order_selector Order2, order_selector OrderOut,
|
||||||
bool Areal1, bool Areal2, bool ArealOut,
|
bool Areal1, bool Areal2, bool ArealOut,
|
||||||
typename Geometry1, typename Geometry2,
|
typename Geometry1, typename Geometry2,
|
||||||
typename OutputIterator, typename GeometryOut,
|
typename OutputIterator, typename GeometryOut,
|
||||||
@ -269,6 +296,7 @@ struct intersection_inserter_reversed
|
|||||||
return intersection_inserter
|
return intersection_inserter
|
||||||
<
|
<
|
||||||
GeometryTag2, GeometryTag1, GeometryTag3,
|
GeometryTag2, GeometryTag1, GeometryTag3,
|
||||||
|
Order2, Order1, OrderOut,
|
||||||
Areal2, Areal1, ArealOut,
|
Areal2, Areal1, ArealOut,
|
||||||
Geometry2, Geometry1,
|
Geometry2, Geometry1,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -327,6 +355,9 @@ inline OutputIterator intersection_inserter(Geometry1 const& geometry1,
|
|||||||
typename tag<Geometry1>::type,
|
typename tag<Geometry1>::type,
|
||||||
typename tag<Geometry2>::type,
|
typename tag<Geometry2>::type,
|
||||||
typename tag<GeometryOut>::type,
|
typename tag<GeometryOut>::type,
|
||||||
|
point_order<Geometry1>::value,
|
||||||
|
point_order<Geometry2>::value,
|
||||||
|
point_order<GeometryOut>::value,
|
||||||
is_areal<Geometry1>::value,
|
is_areal<Geometry1>::value,
|
||||||
is_areal<Geometry2>::value,
|
is_areal<Geometry2>::value,
|
||||||
is_areal<GeometryOut>::value,
|
is_areal<GeometryOut>::value,
|
||||||
@ -340,6 +371,9 @@ inline OutputIterator intersection_inserter(Geometry1 const& geometry1,
|
|||||||
typename tag<Geometry1>::type,
|
typename tag<Geometry1>::type,
|
||||||
typename tag<Geometry2>::type,
|
typename tag<Geometry2>::type,
|
||||||
typename tag<GeometryOut>::type,
|
typename tag<GeometryOut>::type,
|
||||||
|
point_order<Geometry1>::value,
|
||||||
|
point_order<Geometry2>::value,
|
||||||
|
point_order<GeometryOut>::value,
|
||||||
is_areal<Geometry1>::value,
|
is_areal<Geometry1>::value,
|
||||||
is_areal<Geometry2>::value,
|
is_areal<Geometry2>::value,
|
||||||
is_areal<GeometryOut>::value,
|
is_areal<GeometryOut>::value,
|
||||||
|
@ -38,7 +38,7 @@ template
|
|||||||
>
|
>
|
||||||
struct union_inserter
|
struct union_inserter
|
||||||
: detail::overlay::overlay
|
: detail::overlay::overlay
|
||||||
<G1, G2, OutputIterator, GeometryOut, 1, Strategy>
|
<G1, G2, OutputIterator, GeometryOut, 1, true, Strategy>
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,16 +18,26 @@
|
|||||||
#include <boost/geometry/multi/core/tags.hpp>
|
#include <boost/geometry/multi/core/tags.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace boost { namespace geometry
|
namespace boost { namespace geometry
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DOXYGEN_NO_DISPATCH
|
#ifndef DOXYGEN_NO_DISPATCH
|
||||||
namespace dispatch
|
namespace dispatch
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template <typename MultiPoint>
|
||||||
|
struct correct<multi_point_tag, MultiPoint>
|
||||||
|
: detail::correct::correct_nop<MultiPoint>
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
template <typename MultiLineString>
|
||||||
|
struct correct<multi_linestring_tag, MultiLineString>
|
||||||
|
: detail::correct::correct_nop<MultiLineString>
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
template <typename Geometry>
|
template <typename Geometry>
|
||||||
struct correct<multi_polygon_tag, Geometry>
|
struct correct<multi_polygon_tag, Geometry>
|
||||||
: detail::multi_modify
|
: detail::multi_modify
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <boost/geometry/algorithms/intersection.hpp>
|
#include <boost/geometry/algorithms/intersection.hpp>
|
||||||
#include <boost/geometry/multi/core/is_areal.hpp>
|
#include <boost/geometry/multi/core/is_areal.hpp>
|
||||||
|
#include <boost/geometry/multi/core/point_order.hpp>
|
||||||
#include <boost/geometry/multi/algorithms/detail/overlay/assemble.hpp>
|
#include <boost/geometry/multi/algorithms/detail/overlay/assemble.hpp>
|
||||||
|
|
||||||
|
|
||||||
@ -119,6 +120,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
multi_linestring_tag, multi_linestring_tag, point_tag,
|
multi_linestring_tag, multi_linestring_tag, point_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, false, false,
|
false, false, false,
|
||||||
MultiLinestring1, MultiLinestring2,
|
MultiLinestring1, MultiLinestring2,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
@ -140,6 +142,7 @@ template
|
|||||||
struct intersection_inserter
|
struct intersection_inserter
|
||||||
<
|
<
|
||||||
linestring_tag, multi_linestring_tag, point_tag,
|
linestring_tag, multi_linestring_tag, point_tag,
|
||||||
|
clockwise, clockwise, clockwise,
|
||||||
false, false, false,
|
false, false, false,
|
||||||
Linestring, MultiLinestring,
|
Linestring, MultiLinestring,
|
||||||
OutputIterator, GeometryOut,
|
OutputIterator, GeometryOut,
|
||||||
|
43
include/boost/geometry/multi/core/point_order.hpp
Normal file
43
include/boost/geometry/multi/core/point_order.hpp
Normal file
@ -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 <boost/range.hpp>
|
||||||
|
|
||||||
|
#include <boost/geometry/core/point_order.hpp>
|
||||||
|
#include <boost/geometry/core/tag.hpp>
|
||||||
|
#include <boost/geometry/core/tags.hpp>
|
||||||
|
|
||||||
|
namespace boost { namespace geometry
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DOXYGEN_NO_DISPATCH
|
||||||
|
namespace core_dispatch
|
||||||
|
{
|
||||||
|
|
||||||
|
// Specialization for multi_polygon: the order is the order of its polygons
|
||||||
|
template <typename MultiPolygon>
|
||||||
|
struct point_order<multi_polygon_tag, MultiPolygon>
|
||||||
|
{
|
||||||
|
static const order_selector value = core_dispatch::point_order
|
||||||
|
<
|
||||||
|
polygon_tag,
|
||||||
|
typename boost::range_value<MultiPolygon>::type
|
||||||
|
>::value ;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace core_dispatch
|
||||||
|
#endif // DOXYGEN_NO_DISPATCH
|
||||||
|
|
||||||
|
|
||||||
|
}} // namespace boost::geometry
|
||||||
|
|
||||||
|
#endif // BOOST_GEOMETRY_MULTI_CORE_POINT_ORDER_HPP
|
@ -20,6 +20,133 @@
|
|||||||
#include <test_geometries/custom_segment.hpp>
|
#include <test_geometries/custom_segment.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
template <typename Polygon>
|
||||||
|
void test_polygons()
|
||||||
|
{
|
||||||
|
test_one<Polygon, Polygon, Polygon>("simplex_normal",
|
||||||
|
simplex_normal[0], simplex_normal[1],
|
||||||
|
1, 7, 5.47363293);
|
||||||
|
test_one<Polygon, Polygon, Polygon>("star_ring", example_star, example_ring,
|
||||||
|
1, 18, 2.80983);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("star_poly", example_star, example_polygon,
|
||||||
|
1, 0, // CLN: 23 points, other types: 22 point (one is merged)
|
||||||
|
2.5020508);
|
||||||
|
test_one<Polygon, Polygon, Polygon>("first_within_second1",
|
||||||
|
first_within_second[0], first_within_second[1],
|
||||||
|
1, 5, 1.0);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("first_within_second2",
|
||||||
|
first_within_second[1], first_within_second[0],
|
||||||
|
1, 5, 1.0);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("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<Polygon, Polygon, Polygon>("new_hole",
|
||||||
|
new_hole[0], new_hole[1],
|
||||||
|
2, 10, 2.0);
|
||||||
|
|
||||||
|
// Two identical
|
||||||
|
test_one<Polygon, Polygon, Polygon>("identical",
|
||||||
|
identical[0], identical[1],
|
||||||
|
1, 5, 1.0);
|
||||||
|
|
||||||
|
// Two, inside each other, having intersections but holes are disjoint
|
||||||
|
test_one<Polygon, Polygon, Polygon>("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<Polygon, Polygon, Polygon>("intersect_holes_intersect",
|
||||||
|
intersect_holes_intersect[0], intersect_holes_intersect[1],
|
||||||
|
1, 14, 18.25);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("intersect_holes_intersect_and_disjoint",
|
||||||
|
intersect_holes_intersect_and_disjoint[0], intersect_holes_intersect_and_disjoint[1],
|
||||||
|
1, 19, 17.25);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("intersect_holes_intersect_and_touch",
|
||||||
|
intersect_holes_intersect_and_touch[0], intersect_holes_intersect_and_touch[1],
|
||||||
|
1, 23, 17.25);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("intersect_holes_new_ring",
|
||||||
|
intersect_holes_new_ring[0], intersect_holes_new_ring[1],
|
||||||
|
2, 23, 122.1039);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("winded",
|
||||||
|
winded[0], winded[1],
|
||||||
|
1, 22, 40.0);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("two_bends",
|
||||||
|
two_bends[0], two_bends[1],
|
||||||
|
1, 7, 24.0);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("star_comb_15",
|
||||||
|
star_15, comb_15,
|
||||||
|
28, 150, 189.952883);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("simplex_normal",
|
||||||
|
simplex_normal[0], simplex_normal[1],
|
||||||
|
1, 7, 5.47363293);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("fitting",
|
||||||
|
fitting[0], fitting[1],
|
||||||
|
0, 0, 0);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("dist_zero",
|
||||||
|
distance_zero[0], distance_zero[1],
|
||||||
|
1, 0 /* f: 4, other: 5 */, 0.29516139, 0.01);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("ehd",
|
||||||
|
equal_holes_disjoint[0], equal_holes_disjoint[1],
|
||||||
|
1, 20, 81 - 2 * 3 * 3 - 3 * 7);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("only_hole_intersections1",
|
||||||
|
only_hole_intersections[0], only_hole_intersections[1],
|
||||||
|
1, 21, 178.090909);
|
||||||
|
test_one<Polygon, Polygon, Polygon>("only_hole_intersection2",
|
||||||
|
only_hole_intersections[0], only_hole_intersections[2],
|
||||||
|
1, 21, 149.090909);
|
||||||
|
|
||||||
|
test_one<Polygon, Polygon, Polygon>("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, Polygon, Polygon>(
|
||||||
|
"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<typename boost::geometry::coordinate_type<Polygon>::type>::name();
|
||||||
|
test_one<Polygon, Polygon, Polygon>("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<Polygon, Polygon, Polygon>("icovist_r",
|
||||||
|
isovist[0], isovist[2],
|
||||||
|
1, 4, 0.29516139, 0.01);
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <typename P>
|
template <typename P>
|
||||||
void test_all()
|
void test_all()
|
||||||
@ -31,9 +158,11 @@ void test_all()
|
|||||||
|
|
||||||
std::string clip = "box(2 2,8 8)";
|
std::string clip = "box(2 2,8 8)";
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("simplex_normal",
|
// Test clockwise polygons
|
||||||
simplex_normal[0], simplex_normal[1],
|
test_polygons<polygon>();
|
||||||
1, 7, 5.47363293);
|
|
||||||
|
// Test counter-clockwise polygons
|
||||||
|
test_polygons<boost::geometry::polygon<P, std::vector, std::vector, false> >();
|
||||||
|
|
||||||
|
|
||||||
// Basic check: box/linestring, is clipping OK? should compile in any order
|
// Basic check: box/linestring, is clipping OK? should compile in any order
|
||||||
@ -68,12 +197,6 @@ void test_all()
|
|||||||
test_one<polygon, box, polygon>("boxpoly", example_box, example_polygon,
|
test_one<polygon, box, polygon>("boxpoly", example_box, example_polygon,
|
||||||
3, 19, 0.840166);
|
3, 19, 0.840166);
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("star_ring", example_star, example_ring,
|
|
||||||
1, 18, 2.80983);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("star_poly", example_star, example_polygon,
|
|
||||||
1, 0, // CLN: 23 points, other types: 22 point (one is merged)
|
|
||||||
2.5020508);
|
|
||||||
|
|
||||||
|
|
||||||
test_one<polygon, box, polygon>("poly1", example_box,
|
test_one<polygon, box, polygon>("poly1", example_box,
|
||||||
@ -101,88 +224,6 @@ void test_all()
|
|||||||
test_one<polygon, box, polygon>("clip_poly7", "box(0 0, 3 3)",
|
test_one<polygon, box, polygon>("clip_poly7", "box(0 0, 3 3)",
|
||||||
"POLYGON((2 2, 1 4, 2 4, 3 3, 2 2))", 1, 4, 0.75);
|
"POLYGON((2 2, 1 4, 2 4, 3 3, 2 2))", 1, 4, 0.75);
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("first_within_second1",
|
|
||||||
first_within_second[0], first_within_second[1],
|
|
||||||
1, 5, 1.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("first_within_second2",
|
|
||||||
first_within_second[1], first_within_second[0],
|
|
||||||
1, 5, 1.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("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<polygon, polygon, polygon>("new_hole",
|
|
||||||
new_hole[0], new_hole[1],
|
|
||||||
2, 10, 2.0);
|
|
||||||
|
|
||||||
// Two identical
|
|
||||||
test_one<polygon, polygon, polygon>("identical",
|
|
||||||
identical[0], identical[1],
|
|
||||||
1, 5, 1.0);
|
|
||||||
|
|
||||||
// Two, inside each other, having intersections but holes are disjoint
|
|
||||||
test_one<polygon, polygon, polygon>("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<polygon, polygon, polygon>("intersect_holes_intersect",
|
|
||||||
intersect_holes_intersect[0], intersect_holes_intersect[1],
|
|
||||||
1, 14, 18.25);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("intersect_holes_intersect_and_disjoint",
|
|
||||||
intersect_holes_intersect_and_disjoint[0], intersect_holes_intersect_and_disjoint[1],
|
|
||||||
1, 19, 17.25);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("intersect_holes_intersect_and_touch",
|
|
||||||
intersect_holes_intersect_and_touch[0], intersect_holes_intersect_and_touch[1],
|
|
||||||
1, 23, 17.25);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("intersect_holes_new_ring",
|
|
||||||
intersect_holes_new_ring[0], intersect_holes_new_ring[1],
|
|
||||||
2, 23, 122.1039);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("winded",
|
|
||||||
winded[0], winded[1],
|
|
||||||
1, 22, 40.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("two_bends",
|
|
||||||
two_bends[0], two_bends[1],
|
|
||||||
1, 7, 24.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("star_comb_15",
|
|
||||||
star_15, comb_15,
|
|
||||||
28, 150, 189.952883);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("simplex_normal",
|
|
||||||
simplex_normal[0], simplex_normal[1],
|
|
||||||
1, 7, 5.47363293);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("fitting",
|
|
||||||
fitting[0], fitting[1],
|
|
||||||
0, 0, 0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("dist_zero",
|
|
||||||
distance_zero[0], distance_zero[1],
|
|
||||||
1, 0 /* f: 4, other: 5 */, 0.29516139, 0.01);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("ehd",
|
|
||||||
equal_holes_disjoint[0], equal_holes_disjoint[1],
|
|
||||||
1, 20, 81 - 2 * 3 * 3 - 3 * 7);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("only_hole_intersections1",
|
|
||||||
only_hole_intersections[0], only_hole_intersections[1],
|
|
||||||
1, 21, 178.090909);
|
|
||||||
test_one<polygon, polygon, polygon>("only_hole_intersection2",
|
|
||||||
only_hole_intersections[0], only_hole_intersections[2],
|
|
||||||
1, 21, 149.090909);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("intersect_exterior_and_interiors_winded",
|
|
||||||
intersect_exterior_and_interiors_winded[0], intersect_exterior_and_interiors_winded[1],
|
|
||||||
1, 14, 25.2166667);
|
|
||||||
|
|
||||||
// linear
|
// linear
|
||||||
test_one<P, linestring, linestring>("llp1", "LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", 1, 1, 0);
|
test_one<P, linestring, linestring>("llp1", "LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", 1, 1, 0);
|
||||||
@ -193,60 +234,6 @@ void test_all()
|
|||||||
//test_one<P, polygon, polygon>("ppp1", simplex_normal[0], simplex_normal[1], 1, 7, 5.47363293);
|
//test_one<P, polygon, polygon>("ppp1", simplex_normal[0], simplex_normal[1], 1, 7, 5.47363293);
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>(
|
|
||||||
"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<polygon, polygon, polygon>(
|
|
||||||
"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<polygon, polygon, polygon>(102,
|
|
||||||
simplex_normal[0], simplex_reversed[1],
|
|
||||||
1, 7, 24.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>(103,
|
|
||||||
simplex_reversed[0], simplex_normal[1],
|
|
||||||
1, 7, 24.0);
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>(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<typename boost::geometry::coordinate_type<P>::type>::name();
|
|
||||||
test_one<polygon, polygon, polygon>("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<polygon, polygon, polygon>("icovist_r",
|
|
||||||
isovist[0], isovist[2],
|
|
||||||
1, 4, 0.29516139, 0.01);
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
test_one<polygon, box, polygon>(99, "box(115041.10 471900.10, 118334.60 474523.40)",
|
test_one<polygon, box, polygon>(99, "box(115041.10 471900.10, 118334.60 474523.40)",
|
||||||
@ -292,25 +279,12 @@ void test_pointer_version()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
void test_ccw()
|
|
||||||
{
|
|
||||||
typedef boost::geometry::polygon<P, std::vector, std::vector, true> polygon;
|
|
||||||
|
|
||||||
test_one<polygon, polygon, polygon>("simplex_normal",
|
|
||||||
simplex_normal[0], simplex_normal[1],
|
|
||||||
1, 7, 5.47363293);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int test_main(int, char* [])
|
int test_main(int, char* [])
|
||||||
{
|
{
|
||||||
test_all<boost::geometry::point_xy<float> >();
|
test_all<boost::geometry::point_xy<float> >();
|
||||||
test_all<boost::geometry::point_xy<double> >();
|
test_all<boost::geometry::point_xy<double> >();
|
||||||
|
|
||||||
//test_ccw<boost::geometry::point_xy<double> >();
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_CLN)
|
#if defined(HAVE_CLN)
|
||||||
test_all<boost::geometry::point_xy<boost::numeric_adaptor::cln_value_type> >();
|
test_all<boost::geometry::point_xy<boost::numeric_adaptor::cln_value_type> >();
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,28 +18,6 @@
|
|||||||
|
|
||||||
namespace bg = boost::geometry;
|
namespace bg = boost::geometry;
|
||||||
|
|
||||||
template <typename Vector>
|
|
||||||
void reverse_operations(Vector& v)
|
|
||||||
{
|
|
||||||
using namespace bg::detail::overlay;
|
|
||||||
|
|
||||||
typedef typename boost::range_value<Vector>::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 <typename Geometry>
|
template <typename Geometry>
|
||||||
inline typename bg::coordinate_type<Geometry>::type intersect(Geometry const& g1, Geometry const& g2, std::string const& name,
|
inline typename bg::coordinate_type<Geometry>::type intersect(Geometry const& g1, Geometry const& g2, std::string const& name,
|
||||||
@ -63,7 +41,7 @@ inline typename bg::coordinate_type<Geometry>::type intersect(Geometry const& g1
|
|||||||
bool const reverse = bg::point_order<Geometry>::value == bg::counterclockwise;
|
bool const reverse = bg::point_order<Geometry>::value == bg::counterclockwise;
|
||||||
if (reverse)
|
if (reverse)
|
||||||
{
|
{
|
||||||
reverse_operations(turns);
|
bg::detail::overlay::reverse_operations(turns);
|
||||||
}
|
}
|
||||||
bg::enrich_intersection_points(turns, g1, g2, side_strategy_type());
|
bg::enrich_intersection_points(turns, g1, g2, side_strategy_type());
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
# Visual C++ Express 2005
|
# 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}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "traverse", "traverse.vcproj", "{6260214E-DB6F-4934-ADF7-DD2B1666171B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "self_intersection_points", "self_intersection_points.vcproj", "{06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}"
|
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
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assemble", "assemble.vcproj", "{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assemble", "assemble.vcproj", "{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}"
|
||||||
EndProject
|
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}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dissolver", "dissolver.vcproj", "{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccw_traverse", "ccw_traverse.vcproj", "{BA789719-B2FC-405A-9258-E9E4ABCE1791}"
|
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
|
Release|Win32 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
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.ActiveCfg = Debug|Win32
|
||||||
{6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.Build.0 = Debug|Win32
|
{6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.ActiveCfg = Release|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}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.ActiveCfg = Release|Win32
|
{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.Build.0 = 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.ActiveCfg = Debug|Win32
|
||||||
{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Debug|Win32.Build.0 = Debug|Win32
|
{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Release|Win32.ActiveCfg = Release|Win32
|
{6CCB145C-C682-4B9F-8672-6D04DB5C76DD}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <boost/geometry/algorithms/intersection.hpp>
|
#include <boost/geometry/algorithms/intersection.hpp>
|
||||||
#include <boost/geometry/algorithms/area.hpp>
|
#include <boost/geometry/algorithms/area.hpp>
|
||||||
|
#include <boost/geometry/algorithms/correct.hpp>
|
||||||
#include <boost/geometry/algorithms/length.hpp>
|
#include <boost/geometry/algorithms/length.hpp>
|
||||||
#include <boost/geometry/algorithms/num_points.hpp>
|
#include <boost/geometry/algorithms/num_points.hpp>
|
||||||
#include <boost/geometry/algorithms/unique.hpp>
|
#include <boost/geometry/algorithms/unique.hpp>
|
||||||
@ -164,6 +165,10 @@ double test_one(std::string const& caseid, std::string const& wkt1, std::string
|
|||||||
G2 g2;
|
G2 g2;
|
||||||
boost::geometry::read_wkt(wkt2, g2);
|
boost::geometry::read_wkt(wkt2, g2);
|
||||||
|
|
||||||
|
// Reverse if necessary
|
||||||
|
boost::geometry::correct(g1);
|
||||||
|
boost::geometry::correct(g2);
|
||||||
|
|
||||||
return test_intersection<OutputType, void>(caseid, g1, g2,
|
return test_intersection<OutputType, void>(caseid, g1, g2,
|
||||||
expected_count, expected_point_count,
|
expected_count, expected_point_count,
|
||||||
expected_length_or_area, percentage, make_unique);
|
expected_length_or_area, percentage, make_unique);
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <algorithms/test_overlay.hpp>
|
#include <algorithms/test_overlay.hpp>
|
||||||
#include <multi/algorithms/overlay/multi_overlay_cases.hpp>
|
#include <multi/algorithms/overlay/multi_overlay_cases.hpp>
|
||||||
|
|
||||||
|
#include <boost/geometry/multi/algorithms/correct.hpp>
|
||||||
#include <boost/geometry/multi/algorithms/intersection.hpp>
|
#include <boost/geometry/multi/algorithms/intersection.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/multi/geometries/multi_point.hpp>
|
#include <boost/geometry/multi/geometries/multi_point.hpp>
|
||||||
@ -21,42 +22,52 @@
|
|||||||
|
|
||||||
#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
|
#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
|
||||||
|
|
||||||
|
template <typename Ring, typename Polygon, typename MultiPolygon>
|
||||||
|
void test_areal()
|
||||||
|
{
|
||||||
|
test_one<Polygon, MultiPolygon, MultiPolygon>("simplex_multi",
|
||||||
|
case_multi_simplex[0], case_multi_simplex[1],
|
||||||
|
2, 12, 6.42);
|
||||||
|
|
||||||
|
test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_no_ip",
|
||||||
|
case_multi_no_ip[0], case_multi_no_ip[1],
|
||||||
|
2, 8, 8.5);
|
||||||
|
test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_2",
|
||||||
|
case_multi_2[0], case_multi_2[1],
|
||||||
|
3, 12, 5.9);
|
||||||
|
|
||||||
|
test_one<Polygon, MultiPolygon, Polygon>("simplex_multi_mp_p",
|
||||||
|
case_multi_simplex[0], case_single_simplex,
|
||||||
|
2, 12, 6.42);
|
||||||
|
|
||||||
|
test_one<Polygon, Ring, MultiPolygon>("simplex_multi_r_mp",
|
||||||
|
case_single_simplex, case_multi_simplex[0],
|
||||||
|
2, 12, 6.42);
|
||||||
|
test_one<Ring, MultiPolygon, Polygon>("simplex_multi_mp_r",
|
||||||
|
case_multi_simplex[0], case_single_simplex,
|
||||||
|
2, 12, 6.42);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <typename P>
|
template <typename P>
|
||||||
void test_all()
|
void test_all()
|
||||||
{
|
{
|
||||||
// polygon/multi polygon and ring/multi polygon are tested in union
|
|
||||||
|
|
||||||
namespace bg = boost::geometry;
|
namespace bg = boost::geometry;
|
||||||
|
|
||||||
|
|
||||||
typedef bg::linear_ring<P> ring;
|
typedef bg::linear_ring<P> ring;
|
||||||
typedef bg::polygon<P> polygon;
|
typedef bg::polygon<P> polygon;
|
||||||
typedef bg::multi_polygon<polygon> multi_polygon;
|
typedef bg::multi_polygon<polygon> multi_polygon;
|
||||||
|
test_areal<ring, polygon, multi_polygon>();
|
||||||
|
|
||||||
|
typedef bg::linear_ring<P, std::vector, false> ring_ccw;
|
||||||
|
typedef bg::polygon<P, std::vector, std::vector, false> polygon_ccw;
|
||||||
|
typedef bg::multi_polygon<polygon_ccw> multi_polygon_ccw;
|
||||||
|
test_areal<ring_ccw, polygon_ccw, multi_polygon_ccw>();
|
||||||
|
|
||||||
typedef bg::linestring<P> linestring;
|
typedef bg::linestring<P> linestring;
|
||||||
typedef bg::multi_linestring<linestring> multi_linestring;
|
typedef bg::multi_linestring<linestring> multi_linestring;
|
||||||
|
|
||||||
test_one<polygon, multi_polygon, multi_polygon>("simplex_multi",
|
|
||||||
case_multi_simplex[0], case_multi_simplex[1],
|
|
||||||
2, 12, 6.42);
|
|
||||||
|
|
||||||
test_one<polygon, multi_polygon, multi_polygon>("case_multi_no_ip",
|
|
||||||
case_multi_no_ip[0], case_multi_no_ip[1],
|
|
||||||
2, 8, 8.5);
|
|
||||||
test_one<polygon, multi_polygon, multi_polygon>("case_multi_2",
|
|
||||||
case_multi_2[0], case_multi_2[1],
|
|
||||||
3, 12, 5.9);
|
|
||||||
|
|
||||||
test_one<polygon, multi_polygon, polygon>("simplex_multi_mp_p",
|
|
||||||
case_multi_simplex[0], case_single_simplex,
|
|
||||||
2, 12, 6.42);
|
|
||||||
|
|
||||||
test_one<polygon, ring, multi_polygon>("simplex_multi_r_mp",
|
|
||||||
case_single_simplex, case_multi_simplex[0],
|
|
||||||
2, 12, 6.42);
|
|
||||||
test_one<ring, multi_polygon, polygon>("simplex_multi_mp_r",
|
|
||||||
case_multi_simplex[0], case_single_simplex,
|
|
||||||
2, 12, 6.42);
|
|
||||||
|
|
||||||
|
|
||||||
// linear
|
// linear
|
||||||
test_one<P, multi_linestring, multi_linestring>("case_multi_linear_1",
|
test_one<P, multi_linestring, multi_linestring>("case_multi_linear_1",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user