// 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) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
|
|
// This file was modified by Oracle on 2014.
|
// Modifications copyright (c) 2014, Oracle and/or its affiliates.
|
|
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
|
|
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
|
// (geolib/GGL), copyright (c) 1995-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_DISTANCE_BACKWARD_COMPATIBILITY_HPP
|
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP
|
|
#include <boost/geometry/core/closure.hpp>
|
#include <boost/geometry/core/point_type.hpp>
|
#include <boost/geometry/core/tags.hpp>
|
|
#include <boost/geometry/strategies/distance.hpp>
|
#include <boost/geometry/strategies/tags.hpp>
|
|
#include <boost/geometry/algorithms/assign.hpp>
|
|
#include <boost/geometry/algorithms/dispatch/distance.hpp>
|
|
#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
|
#include <boost/geometry/algorithms/detail/distance/point_to_geometry.hpp>
|
#include <boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp>
|
|
|
namespace boost { namespace geometry
|
{
|
|
|
#ifndef DOXYGEN_NO_DETAIL
|
namespace detail { namespace distance
|
{
|
|
|
template<typename Point, typename Segment, typename Strategy>
|
struct point_to_segment
|
{
|
static inline typename strategy::distance::services::return_type
|
<
|
Strategy,
|
Point,
|
typename point_type<Segment>::type
|
>::type
|
apply(Point const& point, Segment const& segment, Strategy const& )
|
{
|
typename detail::distance::default_ps_strategy
|
<
|
Point,
|
typename point_type<Segment>::type,
|
Strategy
|
>::type segment_strategy;
|
|
typename point_type<Segment>::type p[2];
|
geometry::detail::assign_point_from_index<0>(segment, p[0]);
|
geometry::detail::assign_point_from_index<1>(segment, p[1]);
|
return segment_strategy.apply(point, p[0], p[1]);
|
}
|
};
|
|
|
}} // namespace detail::distance
|
#endif // DOXYGEN_NO_DETAIL
|
|
|
|
|
#ifndef DOXYGEN_NO_DISPATCH
|
namespace dispatch
|
{
|
|
|
// Point-segment version 1, with point-point strategy
|
template <typename Point, typename Segment, typename Strategy>
|
struct distance
|
<
|
Point, Segment, Strategy,
|
point_tag, segment_tag, strategy_tag_distance_point_point,
|
false
|
> : detail::distance::point_to_segment<Point, Segment, Strategy>
|
{};
|
|
|
// Point-line version 1, where point-point strategy is specified
|
template <typename Point, typename Linestring, typename Strategy>
|
struct distance
|
<
|
Point, Linestring, Strategy,
|
point_tag, linestring_tag, strategy_tag_distance_point_point,
|
false
|
>
|
{
|
|
static inline typename strategy::distance::services::return_type
|
<
|
Strategy, Point, typename point_type<Linestring>::type
|
>::type
|
apply(Point const& point,
|
Linestring const& linestring,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
Point,
|
typename point_type<Linestring>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return detail::distance::point_to_range
|
<
|
Point, Linestring, closed, ps_strategy_type
|
>::apply(point, linestring, ps_strategy_type());
|
}
|
};
|
|
|
// Point-ring , where point-point strategy is specified
|
template <typename Point, typename Ring, typename Strategy>
|
struct distance
|
<
|
Point, Ring, Strategy,
|
point_tag, ring_tag, strategy_tag_distance_point_point,
|
false
|
>
|
{
|
typedef typename strategy::distance::services::return_type
|
<
|
Strategy, Point, typename point_type<Ring>::type
|
>::type return_type;
|
|
static inline return_type apply(Point const& point,
|
Ring const& ring,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
Point,
|
typename point_type<Ring>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return detail::distance::point_to_ring
|
<
|
Point, Ring,
|
geometry::closure<Ring>::value,
|
ps_strategy_type
|
>::apply(point, ring, ps_strategy_type());
|
}
|
};
|
|
|
// Point-polygon , where point-point strategy is specified
|
template <typename Point, typename Polygon, typename Strategy>
|
struct distance
|
<
|
Point, Polygon, Strategy,
|
point_tag, polygon_tag, strategy_tag_distance_point_point,
|
false
|
>
|
{
|
typedef typename strategy::distance::services::return_type
|
<
|
Strategy, Point, typename point_type<Polygon>::type
|
>::type return_type;
|
|
static inline return_type apply(Point const& point,
|
Polygon const& polygon,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
Point,
|
typename point_type<Polygon>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return detail::distance::point_to_polygon
|
<
|
Point,
|
Polygon,
|
geometry::closure<Polygon>::value,
|
ps_strategy_type
|
>::apply(point, polygon, ps_strategy_type());
|
}
|
};
|
|
|
|
|
template
|
<
|
typename Point,
|
typename MultiGeometry,
|
typename MultiGeometryTag,
|
typename Strategy
|
>
|
struct distance
|
<
|
Point, MultiGeometry, Strategy,
|
point_tag, MultiGeometryTag,
|
strategy_tag_distance_point_point, false
|
>
|
{
|
typedef typename strategy::distance::services::return_type
|
<
|
Strategy, Point, typename point_type<MultiGeometry>::type
|
>::type return_type;
|
|
static inline return_type apply(Point const& point,
|
MultiGeometry const& multigeometry,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
Point,
|
typename point_type<MultiGeometry>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return distance
|
<
|
Point, MultiGeometry, ps_strategy_type,
|
point_tag, MultiGeometryTag,
|
strategy_tag_distance_point_segment, false
|
>::apply(point, multigeometry, ps_strategy_type());
|
}
|
};
|
|
|
template
|
<
|
typename Geometry,
|
typename MultiPoint,
|
typename GeometryTag,
|
typename Strategy
|
>
|
struct distance
|
<
|
Geometry, MultiPoint, Strategy,
|
GeometryTag, multi_point_tag,
|
strategy_tag_distance_point_point, false
|
>
|
{
|
typedef typename strategy::distance::services::return_type
|
<
|
Strategy,
|
typename point_type<MultiPoint>::type,
|
typename point_type<Geometry>::type
|
>::type return_type;
|
|
static inline return_type apply(Geometry const& geometry,
|
MultiPoint const& multipoint,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
typename point_type<MultiPoint>::type,
|
typename point_type<Geometry>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return distance
|
<
|
Geometry, MultiPoint, ps_strategy_type,
|
GeometryTag, multi_point_tag,
|
strategy_tag_distance_point_segment, false
|
>::apply(geometry, multipoint, ps_strategy_type());
|
}
|
};
|
|
|
template
|
<
|
typename MultiPoint,
|
typename MultiGeometry,
|
typename MultiGeometryTag,
|
typename Strategy
|
>
|
struct distance
|
<
|
MultiPoint, MultiGeometry, Strategy,
|
multi_point_tag, MultiGeometryTag,
|
strategy_tag_distance_point_point, false
|
>
|
{
|
typedef typename strategy::distance::services::return_type
|
<
|
Strategy,
|
typename point_type<MultiPoint>::type,
|
typename point_type<MultiGeometry>::type
|
>::type return_type;
|
|
static inline return_type apply(MultiPoint const& multipoint,
|
MultiGeometry const& multigeometry,
|
Strategy const&)
|
{
|
typedef typename detail::distance::default_ps_strategy
|
<
|
typename point_type<MultiPoint>::type,
|
typename point_type<MultiGeometry>::type,
|
Strategy
|
>::type ps_strategy_type;
|
|
return distance
|
<
|
MultiPoint, MultiGeometry, ps_strategy_type,
|
multi_point_tag, MultiGeometryTag,
|
strategy_tag_distance_point_segment, false
|
>::apply(multipoint, multigeometry, ps_strategy_type());
|
}
|
};
|
|
|
} // namespace dispatch
|
#endif // DOXYGEN_NO_DISPATCH
|
|
|
}} // namespace boost::geometry
|
|
|
#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP
|