annotate DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/interface.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@102 2
Chris@102 3 // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
Chris@102 4 // Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
Chris@102 5 // Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
Chris@102 6 // Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
Chris@102 7 // Copyright (c) 2014 Samuel Debionne, Grenoble, France.
Chris@102 8
Chris@102 9 // This file was modified by Oracle on 2014.
Chris@102 10 // Modifications copyright (c) 2014, Oracle and/or its affiliates.
Chris@102 11
Chris@102 12 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
Chris@102 13
Chris@102 14 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
Chris@102 15 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
Chris@102 16
Chris@102 17 // Use, modification and distribution is subject to the Boost Software License,
Chris@102 18 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@102 19 // http://www.boost.org/LICENSE_1_0.txt)
Chris@102 20
Chris@102 21 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP
Chris@102 22 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP
Chris@102 23
Chris@102 24 #include <boost/concept_check.hpp>
Chris@102 25
Chris@102 26 #include <boost/mpl/always.hpp>
Chris@102 27 #include <boost/mpl/bool.hpp>
Chris@102 28 #include <boost/mpl/vector.hpp>
Chris@102 29
Chris@102 30 #include <boost/geometry/core/point_type.hpp>
Chris@102 31
Chris@102 32 #include <boost/geometry/geometries/concepts/check.hpp>
Chris@102 33
Chris@102 34 #include <boost/geometry/strategies/default_strategy.hpp>
Chris@102 35 #include <boost/geometry/strategies/distance.hpp>
Chris@102 36 #include <boost/geometry/strategies/default_distance_result.hpp>
Chris@102 37 #include <boost/geometry/strategies/distance_result.hpp>
Chris@102 38
Chris@102 39 #include <boost/geometry/algorithms/detail/throw_on_empty_input.hpp>
Chris@102 40 #include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
Chris@102 41
Chris@102 42 #include <boost/geometry/algorithms/dispatch/distance.hpp>
Chris@102 43
Chris@102 44
Chris@102 45 namespace boost { namespace geometry
Chris@102 46 {
Chris@102 47
Chris@102 48
Chris@102 49 #ifndef DOXYGEN_NO_DISPATCH
Chris@102 50 namespace dispatch
Chris@102 51 {
Chris@102 52
Chris@102 53
Chris@102 54 // If reversal is needed, perform it
Chris@102 55 template
Chris@102 56 <
Chris@102 57 typename Geometry1, typename Geometry2, typename Strategy,
Chris@102 58 typename Tag1, typename Tag2, typename StrategyTag
Chris@102 59 >
Chris@102 60 struct distance
Chris@102 61 <
Chris@102 62 Geometry1, Geometry2, Strategy,
Chris@102 63 Tag1, Tag2, StrategyTag,
Chris@102 64 true
Chris@102 65 >
Chris@102 66 : distance<Geometry2, Geometry1, Strategy, Tag2, Tag1, StrategyTag, false>
Chris@102 67 {
Chris@102 68 typedef typename strategy::distance::services::return_type
Chris@102 69 <
Chris@102 70 Strategy,
Chris@102 71 typename point_type<Geometry2>::type,
Chris@102 72 typename point_type<Geometry1>::type
Chris@102 73 >::type return_type;
Chris@102 74
Chris@102 75 static inline return_type apply(
Chris@102 76 Geometry1 const& g1,
Chris@102 77 Geometry2 const& g2,
Chris@102 78 Strategy const& strategy)
Chris@102 79 {
Chris@102 80 return distance
Chris@102 81 <
Chris@102 82 Geometry2, Geometry1, Strategy,
Chris@102 83 Tag2, Tag1, StrategyTag,
Chris@102 84 false
Chris@102 85 >::apply(g2, g1, strategy);
Chris@102 86 }
Chris@102 87 };
Chris@102 88
Chris@102 89
Chris@102 90 } // namespace dispatch
Chris@102 91 #endif // DOXYGEN_NO_DISPATCH
Chris@102 92
Chris@102 93
Chris@102 94 namespace resolve_strategy
Chris@102 95 {
Chris@102 96
Chris@102 97 struct distance
Chris@102 98 {
Chris@102 99 template <typename Geometry1, typename Geometry2, typename Strategy>
Chris@102 100 static inline typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 101 apply(Geometry1 const& geometry1,
Chris@102 102 Geometry2 const& geometry2,
Chris@102 103 Strategy const& strategy)
Chris@102 104 {
Chris@102 105 return dispatch::distance
Chris@102 106 <
Chris@102 107 Geometry1, Geometry2, Strategy
Chris@102 108 >::apply(geometry1, geometry2, strategy);
Chris@102 109 }
Chris@102 110
Chris@102 111 template <typename Geometry1, typename Geometry2>
Chris@102 112 static inline
Chris@102 113 typename distance_result<Geometry1, Geometry2, default_strategy>::type
Chris@102 114 apply(Geometry1 const& geometry1,
Chris@102 115 Geometry2 const& geometry2,
Chris@102 116 default_strategy)
Chris@102 117 {
Chris@102 118 typedef typename detail::distance::default_strategy
Chris@102 119 <
Chris@102 120 Geometry1, Geometry2
Chris@102 121 >::type strategy_type;
Chris@102 122
Chris@102 123 return dispatch::distance
Chris@102 124 <
Chris@102 125 Geometry1, Geometry2, strategy_type
Chris@102 126 >::apply(geometry1, geometry2, strategy_type());
Chris@102 127 }
Chris@102 128 };
Chris@102 129
Chris@102 130 } // namespace resolve_strategy
Chris@102 131
Chris@102 132
Chris@102 133 namespace resolve_variant
Chris@102 134 {
Chris@102 135
Chris@102 136
Chris@102 137 template <typename Geometry1, typename Geometry2>
Chris@102 138 struct distance
Chris@102 139 {
Chris@102 140 template <typename Strategy>
Chris@102 141 static inline typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 142 apply(Geometry1 const& geometry1,
Chris@102 143 Geometry2 const& geometry2,
Chris@102 144 Strategy const& strategy)
Chris@102 145 {
Chris@102 146 return
Chris@102 147 resolve_strategy::distance::apply(geometry1, geometry2, strategy);
Chris@102 148 }
Chris@102 149 };
Chris@102 150
Chris@102 151
Chris@102 152 template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
Chris@102 153 struct distance<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
Chris@102 154 {
Chris@102 155 template <typename Strategy>
Chris@102 156 struct visitor: static_visitor
Chris@102 157 <
Chris@102 158 typename distance_result
Chris@102 159 <
Chris@102 160 variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
Chris@102 161 Geometry2,
Chris@102 162 Strategy
Chris@102 163 >::type
Chris@102 164 >
Chris@102 165 {
Chris@102 166 Geometry2 const& m_geometry2;
Chris@102 167 Strategy const& m_strategy;
Chris@102 168
Chris@102 169 visitor(Geometry2 const& geometry2,
Chris@102 170 Strategy const& strategy)
Chris@102 171 : m_geometry2(geometry2),
Chris@102 172 m_strategy(strategy)
Chris@102 173 {}
Chris@102 174
Chris@102 175 template <typename Geometry1>
Chris@102 176 typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 177 operator()(Geometry1 const& geometry1) const
Chris@102 178 {
Chris@102 179 return distance
Chris@102 180 <
Chris@102 181 Geometry1,
Chris@102 182 Geometry2
Chris@102 183 >::template apply
Chris@102 184 <
Chris@102 185 Strategy
Chris@102 186 >(geometry1, m_geometry2, m_strategy);
Chris@102 187 }
Chris@102 188 };
Chris@102 189
Chris@102 190 template <typename Strategy>
Chris@102 191 static inline typename distance_result
Chris@102 192 <
Chris@102 193 variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
Chris@102 194 Geometry2,
Chris@102 195 Strategy
Chris@102 196 >::type
Chris@102 197 apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
Chris@102 198 Geometry2 const& geometry2,
Chris@102 199 Strategy const& strategy)
Chris@102 200 {
Chris@102 201 return apply_visitor(visitor<Strategy>(geometry2, strategy), geometry1);
Chris@102 202 }
Chris@102 203 };
Chris@102 204
Chris@102 205
Chris@102 206 template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
Chris@102 207 struct distance<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
Chris@102 208 {
Chris@102 209 template <typename Strategy>
Chris@102 210 struct visitor: static_visitor
Chris@102 211 <
Chris@102 212 typename distance_result
Chris@102 213 <
Chris@102 214 Geometry1,
Chris@102 215 variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
Chris@102 216 Strategy
Chris@102 217 >::type
Chris@102 218 >
Chris@102 219 {
Chris@102 220 Geometry1 const& m_geometry1;
Chris@102 221 Strategy const& m_strategy;
Chris@102 222
Chris@102 223 visitor(Geometry1 const& geometry1,
Chris@102 224 Strategy const& strategy)
Chris@102 225 : m_geometry1(geometry1),
Chris@102 226 m_strategy(strategy)
Chris@102 227 {}
Chris@102 228
Chris@102 229 template <typename Geometry2>
Chris@102 230 typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 231 operator()(Geometry2 const& geometry2) const
Chris@102 232 {
Chris@102 233 return distance
Chris@102 234 <
Chris@102 235 Geometry1,
Chris@102 236 Geometry2
Chris@102 237 >::template apply
Chris@102 238 <
Chris@102 239 Strategy
Chris@102 240 >(m_geometry1, geometry2, m_strategy);
Chris@102 241 }
Chris@102 242 };
Chris@102 243
Chris@102 244 template <typename Strategy>
Chris@102 245 static inline typename distance_result
Chris@102 246 <
Chris@102 247 Geometry1,
Chris@102 248 variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
Chris@102 249 Strategy
Chris@102 250 >::type
Chris@102 251 apply(
Chris@102 252 Geometry1 const& geometry1,
Chris@102 253 const variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry2,
Chris@102 254 Strategy const& strategy)
Chris@102 255 {
Chris@102 256 return apply_visitor(visitor<Strategy>(geometry1, strategy), geometry2);
Chris@102 257 }
Chris@102 258 };
Chris@102 259
Chris@102 260
Chris@102 261 template
Chris@102 262 <
Chris@102 263 BOOST_VARIANT_ENUM_PARAMS(typename T1),
Chris@102 264 BOOST_VARIANT_ENUM_PARAMS(typename T2)
Chris@102 265 >
Chris@102 266 struct distance
Chris@102 267 <
Chris@102 268 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
Chris@102 269 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
Chris@102 270 >
Chris@102 271 {
Chris@102 272 template <typename Strategy>
Chris@102 273 struct visitor: static_visitor
Chris@102 274 <
Chris@102 275 typename distance_result
Chris@102 276 <
Chris@102 277 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
Chris@102 278 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
Chris@102 279 Strategy
Chris@102 280 >::type
Chris@102 281 >
Chris@102 282 {
Chris@102 283 Strategy const& m_strategy;
Chris@102 284
Chris@102 285 visitor(Strategy const& strategy)
Chris@102 286 : m_strategy(strategy)
Chris@102 287 {}
Chris@102 288
Chris@102 289 template <typename Geometry1, typename Geometry2>
Chris@102 290 typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 291 operator()(Geometry1 const& geometry1, Geometry2 const& geometry2) const
Chris@102 292 {
Chris@102 293 return distance
Chris@102 294 <
Chris@102 295 Geometry1,
Chris@102 296 Geometry2
Chris@102 297 >::template apply
Chris@102 298 <
Chris@102 299 Strategy
Chris@102 300 >(geometry1, geometry2, m_strategy);
Chris@102 301 }
Chris@102 302 };
Chris@102 303
Chris@102 304 template <typename Strategy>
Chris@102 305 static inline typename distance_result
Chris@102 306 <
Chris@102 307 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
Chris@102 308 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
Chris@102 309 Strategy
Chris@102 310 >::type
Chris@102 311 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
Chris@102 312 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
Chris@102 313 Strategy const& strategy)
Chris@102 314 {
Chris@102 315 return apply_visitor(visitor<Strategy>(strategy), geometry1, geometry2);
Chris@102 316 }
Chris@102 317 };
Chris@102 318
Chris@102 319 } // namespace resolve_variant
Chris@102 320
Chris@102 321
Chris@102 322 /*!
Chris@102 323 \brief \brief_calc2{distance} \brief_strategy
Chris@102 324 \ingroup distance
Chris@102 325 \details
Chris@102 326 \details \details_calc{area}. \brief_strategy. \details_strategy_reasons
Chris@102 327
Chris@102 328 \tparam Geometry1 \tparam_geometry
Chris@102 329 \tparam Geometry2 \tparam_geometry
Chris@102 330 \tparam Strategy \tparam_strategy{Distance}
Chris@102 331 \param geometry1 \param_geometry
Chris@102 332 \param geometry2 \param_geometry
Chris@102 333 \param strategy \param_strategy{distance}
Chris@102 334 \return \return_calc{distance}
Chris@102 335 \note The strategy can be a point-point strategy. In case of distance point-line/point-polygon
Chris@102 336 it may also be a point-segment strategy.
Chris@102 337
Chris@102 338 \qbk{distinguish,with strategy}
Chris@102 339
Chris@102 340 \qbk{
Chris@102 341 [heading Available Strategies]
Chris@102 342 \* [link geometry.reference.strategies.strategy_distance_pythagoras Pythagoras (cartesian)]
Chris@102 343 \* [link geometry.reference.strategies.strategy_distance_haversine Haversine (spherical)]
Chris@102 344 \* [link geometry.reference.strategies.strategy_distance_cross_track Cross track (spherical\, point-to-segment)]
Chris@102 345 \* [link geometry.reference.strategies.strategy_distance_projected_point Projected point (cartesian\, point-to-segment)]
Chris@102 346 \* more (currently extensions): Vincenty\, Andoyer (geographic)
Chris@102 347 }
Chris@102 348 */
Chris@102 349
Chris@102 350 /*
Chris@102 351 Note, in case of a Compilation Error:
Chris@102 352 if you get:
Chris@102 353 - "Failed to specialize function template ..."
Chris@102 354 - "error: no matching function for call to ..."
Chris@102 355 for distance, it is probably so that there is no specialization
Chris@102 356 for return_type<...> for your strategy.
Chris@102 357 */
Chris@102 358 template <typename Geometry1, typename Geometry2, typename Strategy>
Chris@102 359 inline typename distance_result<Geometry1, Geometry2, Strategy>::type
Chris@102 360 distance(Geometry1 const& geometry1,
Chris@102 361 Geometry2 const& geometry2,
Chris@102 362 Strategy const& strategy)
Chris@102 363 {
Chris@102 364 concept::check<Geometry1 const>();
Chris@102 365 concept::check<Geometry2 const>();
Chris@102 366
Chris@102 367 detail::throw_on_empty_input(geometry1);
Chris@102 368 detail::throw_on_empty_input(geometry2);
Chris@102 369
Chris@102 370 return resolve_variant::distance
Chris@102 371 <
Chris@102 372 Geometry1,
Chris@102 373 Geometry2
Chris@102 374 >::apply(geometry1, geometry2, strategy);
Chris@102 375 }
Chris@102 376
Chris@102 377
Chris@102 378 /*!
Chris@102 379 \brief \brief_calc2{distance}
Chris@102 380 \ingroup distance
Chris@102 381 \details The default strategy is used, corresponding to the coordinate system of the geometries
Chris@102 382 \tparam Geometry1 \tparam_geometry
Chris@102 383 \tparam Geometry2 \tparam_geometry
Chris@102 384 \param geometry1 \param_geometry
Chris@102 385 \param geometry2 \param_geometry
Chris@102 386 \return \return_calc{distance}
Chris@102 387
Chris@102 388 \qbk{[include reference/algorithms/distance.qbk]}
Chris@102 389 */
Chris@102 390 template <typename Geometry1, typename Geometry2>
Chris@102 391 inline typename default_distance_result<Geometry1, Geometry2>::type
Chris@102 392 distance(Geometry1 const& geometry1,
Chris@102 393 Geometry2 const& geometry2)
Chris@102 394 {
Chris@102 395 concept::check<Geometry1 const>();
Chris@102 396 concept::check<Geometry2 const>();
Chris@102 397
Chris@102 398 return distance(geometry1, geometry2, default_strategy());
Chris@102 399 }
Chris@102 400
Chris@102 401 }} // namespace boost::geometry
Chris@102 402
Chris@102 403 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP