/usr/include/boost/geometry/algorithms/detail/overlay
Edit: /usr/include/boost/geometry/algorithms/detail/overlay/pointlike_areal.hpp (9593B)
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2020, Oracle and/or its affiliates.
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_AREAL_HPP
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_AREAL_HPP
#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
{
// difference/intersection of multipoint-multipolygon
template
<
typename MultiPoint,
typename MultiPolygon,
typename PointOut,
overlay_type OverlayType,
typename Policy
>
class multipoint_multipolygon_point
{
private:
template
struct expand_box_point
{
template
static inline void apply(Box& total, Point const& point)
{
geometry::expand(total, point, ExpandPointStrategy());
}
};
template
struct expand_box_boxpair
{
template
static inline void apply(Box1& total, std::pair const& box_pair)
{
geometry::expand(total, box_pair.first, ExpandBoxStrategy());
}
};
template
struct overlaps_box_point
{
template
static inline bool apply(Box const& box, Point const& point)
{
return ! geometry::disjoint(point, box, DisjointPointBoxStrategy());
}
};
template
struct overlaps_box_boxpair
{
template
static inline bool apply(Box1 const& box, std::pair const& box_pair)
{
return ! geometry::disjoint(box, box_pair.first, DisjointBoxBoxStrategy());
}
};
template
class item_visitor_type
{
public:
item_visitor_type(MultiPolygon const& multipolygon,
OutputIterator& oit,
Strategy const& strategy)
: m_multipolygon(multipolygon)
, m_oit(oit)
, m_strategy(strategy)
{}
template
inline bool apply(Point const& item1, std::pair const& item2)
{
action_selector_pl
<
PointOut, overlay_intersection
>::apply(item1,
Policy::apply(item1,
range::at(m_multipolygon,
item2.second),
m_strategy),
m_oit);
return true;
}
private:
MultiPolygon const& m_multipolygon;
OutputIterator& m_oit;
Strategy const& m_strategy;
};
template
static inline void fill_box_pairs(Iterator first, Iterator last,
std::vector > & box_pairs,
EnvelopeStrategy const& strategy)
{
SizeT index = 0;
for (; first != last; ++first, ++index)
{
box_pairs.push_back(
std::make_pair(geometry::return_envelope(*first, strategy),
index));
}
}
template
static inline OutputIterator get_common_points(MultiPoint const& multipoint,
MultiPolygon const& multipolygon,
OutputIterator oit,
Strategy const& strategy)
{
item_visitor_type item_visitor(multipolygon, oit, strategy);
typedef geometry::model::point
<
typename geometry::coordinate_type::type,
geometry::dimension::value,
typename geometry::coordinate_system::type
> point_type;
typedef geometry::model::box box_type;
typedef std::pair box_pair;
std::vector box_pairs;
box_pairs.reserve(boost::size(multipolygon));
fill_box_pairs(boost::begin(multipolygon),
boost::end(multipolygon),
box_pairs,
strategy.get_envelope_strategy());
typedef typename Strategy::envelope_strategy_type::box_expand_strategy_type expand_box_strategy_type;
typedef typename Strategy::disjoint_box_box_strategy_type disjoint_box_box_strategy_type;
typedef typename Strategy::disjoint_point_box_strategy_type disjoint_point_box_strategy_type;
typedef typename Strategy::expand_point_strategy_type expand_point_strategy_type;
geometry::partition
<
box_type
>::apply(multipoint, box_pairs, item_visitor,
expand_box_point(),
overlaps_box_point(),
expand_box_boxpair(),
overlaps_box_boxpair());
return oit;
}
public:
template
static inline OutputIterator apply(MultiPoint const& multipoint,
MultiPolygon const& multipolygon,
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, multipolygon,
std::back_inserter(common_points),
strategy);
return multipoint_multipoint_point
<
MultiPoint, point_vector_type, PointOut, OverlayType
>::apply(multipoint, common_points, robust_policy, oit, strategy);
}
};
}} // namespace detail::overlay
#endif // DOXYGEN_NO_DISPATCH
#ifndef DOXYGEN_NO_DISPATCH
namespace detail_dispatch { namespace overlay
{
// dispatch struct for pointlike-areal difference/intersection computation
template
<
typename PointLike,
typename Areal,
typename PointOut,
overlay_type OverlayType,
typename Tag1,
typename Tag2
>
struct pointlike_areal_point
: not_implemented
{};
template
<
typename Point,
typename Areal,
typename PointOut,
overlay_type OverlayType,
typename Tag2
>
struct pointlike_areal_point
<
Point, Areal, PointOut, OverlayType, point_tag, Tag2
> : detail::overlay::point_single_point
<
Point, Areal, PointOut, OverlayType,
detail::not_
>
{};
// TODO: Consider implementing Areal-specific version
// calculating envelope first in order to reject Points without
// calling disjoint for Rings and Polygons
template
<
typename MultiPoint,
typename Areal,
typename PointOut,
overlay_type OverlayType,
typename Tag2
>
struct pointlike_areal_point
<
MultiPoint, Areal, PointOut, OverlayType, multi_point_tag, Tag2
> : detail::overlay::multipoint_single_point
<
MultiPoint, Areal, PointOut, OverlayType,
detail::not_
>
{};
template
<
typename MultiPoint,
typename MultiPolygon,
typename PointOut,
overlay_type OverlayType
>
struct pointlike_areal_point
<
MultiPoint, MultiPolygon, PointOut, OverlayType, multi_point_tag, multi_polygon_tag
> : detail::overlay::multipoint_multipolygon_point
<
MultiPoint, MultiPolygon, PointOut, OverlayType,
detail::not_
>
{};
}} // namespace detail_dispatch::overlay
#endif // DOXYGEN_NO_DISPATCH
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_AREAL_HPP