annotate DEPENDENCIES/generic/include/boost/geometry/strategies/spherical/ssf.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@16 2
Chris@16 3 // Copyright (c) 2011-2012 Barend Gehrels, Amsterdam, the Netherlands.
Chris@16 4
Chris@16 5 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 #ifndef BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP
Chris@16 10 #define BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP
Chris@16 11
Chris@16 12 #include <boost/mpl/if.hpp>
Chris@16 13 #include <boost/type_traits.hpp>
Chris@16 14
Chris@16 15 #include <boost/geometry/core/cs.hpp>
Chris@16 16 #include <boost/geometry/core/access.hpp>
Chris@16 17 #include <boost/geometry/core/radian_access.hpp>
Chris@16 18
Chris@16 19 #include <boost/geometry/util/math.hpp>
Chris@101 20 #include <boost/geometry/util/promote_floating_point.hpp>
Chris@101 21 #include <boost/geometry/util/select_calculation_type.hpp>
Chris@16 22
Chris@16 23 #include <boost/geometry/strategies/side.hpp>
Chris@16 24 //#include <boost/geometry/strategies/concepts/side_concept.hpp>
Chris@16 25
Chris@16 26
Chris@16 27 namespace boost { namespace geometry
Chris@16 28 {
Chris@16 29
Chris@16 30
Chris@16 31 namespace strategy { namespace side
Chris@16 32 {
Chris@16 33
Chris@101 34 #ifndef DOXYGEN_NO_DETAIL
Chris@101 35 namespace detail
Chris@101 36 {
Chris@101 37
Chris@101 38 template <typename T>
Chris@101 39 int spherical_side_formula(T const& lambda1, T const& delta1,
Chris@101 40 T const& lambda2, T const& delta2,
Chris@101 41 T const& lambda, T const& delta)
Chris@101 42 {
Chris@101 43 // Create temporary points (vectors) on unit a sphere
Chris@101 44 T const cos_delta1 = cos(delta1);
Chris@101 45 T const c1x = cos_delta1 * cos(lambda1);
Chris@101 46 T const c1y = cos_delta1 * sin(lambda1);
Chris@101 47 T const c1z = sin(delta1);
Chris@101 48
Chris@101 49 T const cos_delta2 = cos(delta2);
Chris@101 50 T const c2x = cos_delta2 * cos(lambda2);
Chris@101 51 T const c2y = cos_delta2 * sin(lambda2);
Chris@101 52 T const c2z = sin(delta2);
Chris@101 53
Chris@101 54 // (Third point is converted directly)
Chris@101 55 T const cos_delta = cos(delta);
Chris@101 56
Chris@101 57 // Apply the "Spherical Side Formula" as presented on my blog
Chris@101 58 T const dist
Chris@101 59 = (c1y * c2z - c1z * c2y) * cos_delta * cos(lambda)
Chris@101 60 + (c1z * c2x - c1x * c2z) * cos_delta * sin(lambda)
Chris@101 61 + (c1x * c2y - c1y * c2x) * sin(delta);
Chris@101 62
Chris@101 63 T zero = T();
Chris@101 64 return dist > zero ? 1
Chris@101 65 : dist < zero ? -1
Chris@101 66 : 0;
Chris@101 67 }
Chris@101 68
Chris@101 69 }
Chris@101 70 #endif // DOXYGEN_NO_DETAIL
Chris@16 71
Chris@16 72 /*!
Chris@16 73 \brief Check at which side of a Great Circle segment a point lies
Chris@16 74 left of segment (> 0), right of segment (< 0), on segment (0)
Chris@16 75 \ingroup strategies
Chris@16 76 \tparam CalculationType \tparam_calculation
Chris@16 77 */
Chris@16 78 template <typename CalculationType = void>
Chris@16 79 class spherical_side_formula
Chris@16 80 {
Chris@16 81
Chris@16 82 public :
Chris@16 83 template <typename P1, typename P2, typename P>
Chris@16 84 static inline int apply(P1 const& p1, P2 const& p2, P const& p)
Chris@16 85 {
Chris@101 86 typedef typename promote_floating_point
Chris@16 87 <
Chris@101 88 typename select_calculation_type_alt
Chris@101 89 <
Chris@101 90 CalculationType,
Chris@101 91 P1, P2, P
Chris@101 92 >::type
Chris@101 93 >::type calculation_type;
Chris@16 94
Chris@101 95 calculation_type const lambda1 = get_as_radian<0>(p1);
Chris@101 96 calculation_type const delta1 = get_as_radian<1>(p1);
Chris@101 97 calculation_type const lambda2 = get_as_radian<0>(p2);
Chris@101 98 calculation_type const delta2 = get_as_radian<1>(p2);
Chris@101 99 calculation_type const lambda = get_as_radian<0>(p);
Chris@101 100 calculation_type const delta = get_as_radian<1>(p);
Chris@16 101
Chris@101 102 return detail::spherical_side_formula(lambda1, delta1,
Chris@101 103 lambda2, delta2,
Chris@101 104 lambda, delta);
Chris@16 105 }
Chris@16 106 };
Chris@16 107
Chris@16 108
Chris@16 109 #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
Chris@16 110 namespace services
Chris@16 111 {
Chris@16 112
Chris@16 113 /*template <typename CalculationType>
Chris@16 114 struct default_strategy<spherical_polar_tag, CalculationType>
Chris@16 115 {
Chris@16 116 typedef spherical_side_formula<CalculationType> type;
Chris@16 117 };*/
Chris@16 118
Chris@16 119 template <typename CalculationType>
Chris@16 120 struct default_strategy<spherical_equatorial_tag, CalculationType>
Chris@16 121 {
Chris@16 122 typedef spherical_side_formula<CalculationType> type;
Chris@16 123 };
Chris@16 124
Chris@16 125 template <typename CalculationType>
Chris@16 126 struct default_strategy<geographic_tag, CalculationType>
Chris@16 127 {
Chris@16 128 typedef spherical_side_formula<CalculationType> type;
Chris@16 129 };
Chris@16 130
Chris@16 131 }
Chris@16 132 #endif
Chris@16 133
Chris@16 134 }} // namespace strategy::side
Chris@16 135
Chris@16 136 }} // namespace boost::geometry
Chris@16 137
Chris@16 138
Chris@16 139 #endif // BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP