diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/disjoint/point_point.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/disjoint/point_point.hpp | 165 |
1 files changed, 144 insertions, 21 deletions
diff --git a/boost/geometry/algorithms/detail/disjoint/point_point.hpp b/boost/geometry/algorithms/detail/disjoint/point_point.hpp index b1d32bf95e..7580b7287b 100644 --- a/boost/geometry/algorithms/detail/disjoint/point_point.hpp +++ b/boost/geometry/algorithms/detail/disjoint/point_point.hpp @@ -1,12 +1,12 @@ // 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 +// 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. +// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland -// This file was modified by Oracle on 2013-2014. -// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates. +// This file was modified by Oracle on 2013, 2014, 2015. +// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle @@ -23,11 +23,26 @@ #include <cstddef> +#include <boost/type_traits/is_same.hpp> + #include <boost/geometry/core/access.hpp> +#include <boost/geometry/core/radian_access.hpp> #include <boost/geometry/core/coordinate_dimension.hpp> +#include <boost/geometry/core/coordinate_system.hpp> +#include <boost/geometry/core/coordinate_type.hpp> +#include <boost/geometry/core/cs.hpp> #include <boost/geometry/core/tags.hpp> #include <boost/geometry/util/math.hpp> +#include <boost/geometry/util/select_most_precise.hpp> + +#include <boost/geometry/strategies/strategy_transform.hpp> + +#include <boost/geometry/geometries/helper_geometry.hpp> + +#include <boost/geometry/algorithms/transform.hpp> + +#include <boost/geometry/algorithms/detail/normalize.hpp> #include <boost/geometry/algorithms/dispatch/disjoint.hpp> @@ -40,38 +55,146 @@ namespace boost { namespace geometry namespace detail { namespace disjoint { -template -< - typename Point1, typename Point2, - std::size_t Dimension, std::size_t DimensionCount -> -struct point_point + +template <std::size_t Dimension, std::size_t DimensionCount> +struct point_point_generic { + template <typename Point1, typename Point2> static inline bool apply(Point1 const& p1, Point2 const& p2) { if (! geometry::math::equals(get<Dimension>(p1), get<Dimension>(p2))) { return true; } - return point_point - < - Point1, Point2, - Dimension + 1, DimensionCount - >::apply(p1, p2); + return + point_point_generic<Dimension + 1, DimensionCount>::apply(p1, p2); } }; - -template <typename Point1, typename Point2, std::size_t DimensionCount> -struct point_point<Point1, Point2, DimensionCount, DimensionCount> +template <std::size_t DimensionCount> +struct point_point_generic<DimensionCount, DimensionCount> { - static inline bool apply(Point1 const& , Point2 const& ) + template <typename Point1, typename Point2> + static inline bool apply(Point1 const&, Point2 const&) { return false; } }; +class point_point_on_spheroid +{ +private: + template <typename Point1, typename Point2, bool SameUnits> + struct are_same_points + { + static inline bool apply(Point1 const& point1, Point2 const& point2) + { + typedef typename helper_geometry<Point1>::type helper_point_type1; + typedef typename helper_geometry<Point2>::type helper_point_type2; + + helper_point_type1 point1_normalized + = return_normalized<helper_point_type1>(point1); + helper_point_type2 point2_normalized + = return_normalized<helper_point_type2>(point2); + + return point_point_generic + < + 0, dimension<Point1>::value + >::apply(point1_normalized, point2_normalized); + } + }; + + template <typename Point1, typename Point2> + struct are_same_points<Point1, Point2, false> // points have different units + { + static inline bool apply(Point1 const& point1, Point2 const& point2) + { + typedef typename geometry::select_most_precise + < + typename fp_coordinate_type<Point1>::type, + typename fp_coordinate_type<Point2>::type + >::type calculation_type; + + typename helper_geometry + < + Point1, calculation_type, radian + >::type helper_point1, helper_point2; + + Point1 point1_normalized = return_normalized<Point1>(point1); + Point2 point2_normalized = return_normalized<Point2>(point2); + + geometry::transform(point1_normalized, helper_point1); + geometry::transform(point2_normalized, helper_point2); + + return point_point_generic + < + 0, dimension<Point1>::value + >::apply(helper_point1, helper_point2); + } + }; + +public: + template <typename Point1, typename Point2> + static inline bool apply(Point1 const& point1, Point2 const& point2) + { + return are_same_points + < + Point1, + Point2, + boost::is_same + < + typename coordinate_system<Point1>::type::units, + typename coordinate_system<Point2>::type::units + >::value + >::apply(point1, point2); + } +}; + + +template +< + typename Point1, typename Point2, + std::size_t Dimension, std::size_t DimensionCount, + typename CSTag1 = typename cs_tag<Point1>::type, + typename CSTag2 = CSTag1 +> +struct point_point + : point_point<Point1, Point2, Dimension, DimensionCount, cartesian_tag> +{}; + +template +< + typename Point1, typename Point2, + std::size_t Dimension, std::size_t DimensionCount +> +struct point_point + < + Point1, Point2, Dimension, DimensionCount, spherical_equatorial_tag + > : point_point_on_spheroid +{}; + +template +< + typename Point1, typename Point2, + std::size_t Dimension, std::size_t DimensionCount +> +struct point_point + < + Point1, Point2, Dimension, DimensionCount, geographic_tag + > : point_point_on_spheroid +{}; + +template +< + typename Point1, typename Point2, + std::size_t Dimension, std::size_t DimensionCount +> +struct point_point<Point1, Point2, Dimension, DimensionCount, cartesian_tag> + : point_point_generic<Dimension, DimensionCount> +{}; + + /*! \brief Internal utility function to detect of points are disjoint \note To avoid circular references |