1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2016-2017 Oracle and/or its affiliates.
4 // Contributed and/or modified by Vissarion Fisikopoulos, on behalf of Oracle
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
6 
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 #ifndef BOOST_GEOMETRY_STRATEGIES_SPHERICAL_AZIMUTH_HPP
12 #define BOOST_GEOMETRY_STRATEGIES_SPHERICAL_AZIMUTH_HPP
13 
14 
15 #include <boost/geometry/strategies/azimuth.hpp>
16 #include <boost/geometry/formulas/spherical.hpp>
17 
18 #include <boost/mpl/if.hpp>
19 #include <boost/type_traits/is_void.hpp>
20 
21 
22 namespace boost { namespace geometry
23 {
24 
25 namespace strategy { namespace azimuth
26 {
27 
28 template
29 <
30     typename CalculationType = void
31 >
32 class spherical
33 {
34 public :
35 
spherical()36     inline spherical()
37     {}
38 
39     template <typename T>
apply(T const & lon1_rad,T const & lat1_rad,T const & lon2_rad,T const & lat2_rad,T & a1,T & a2)40     static inline void apply(T const& lon1_rad, T const& lat1_rad,
41                              T const& lon2_rad, T const& lat2_rad,
42                              T& a1, T& a2)
43     {
44         typedef typename boost::mpl::if_
45             <
46                 boost::is_void<CalculationType>, T, CalculationType
47             >::type calc_t;
48 
49         geometry::formula::result_spherical<calc_t>
50             result = geometry::formula::spherical_azimuth<calc_t, true>(
51                         calc_t(lon1_rad), calc_t(lat1_rad),
52                         calc_t(lon2_rad), calc_t(lat2_rad));
53 
54         a1 = result.azimuth;
55         a2 = result.reverse_azimuth;
56     }
57 
58     template <typename T>
apply(T const & lon1_rad,T const & lat1_rad,T const & lon2_rad,T const & lat2_rad,T & a1) const59     inline void apply(T const& lon1_rad, T const& lat1_rad,
60                       T const& lon2_rad, T const& lat2_rad,
61                       T& a1) const
62     {
63          typedef typename boost::mpl::if_
64             <
65                 boost::is_void<CalculationType>, T, CalculationType
66             >::type calc_t;
67 
68         geometry::formula::result_spherical<calc_t>
69             result = geometry::formula::spherical_azimuth<calc_t, false>(
70                         calc_t(lon1_rad), calc_t(lat1_rad),
71                         calc_t(lon2_rad), calc_t(lat2_rad));
72 
73         a1 = result.azimuth;
74     }
75 
76 };
77 
78 #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
79 
80 namespace services
81 {
82 
83 template <typename CalculationType>
84 struct default_strategy<spherical_equatorial_tag, CalculationType>
85 {
86     typedef strategy::azimuth::spherical<CalculationType> type;
87 };
88 
89 /*
90 template <typename CalculationType>
91 struct default_strategy<spherical_polar_tag, CalculationType>
92 {
93     typedef strategy::azimuth::spherical<CalculationType> type;
94 };
95 */
96 }
97 
98 #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
99 
100 }} // namespace strategy::azimuth
101 
102 
103 }} // namespace boost::geometry
104 
105 #endif // BOOST_GEOMETRY_STRATEGIES_SPHERICAL_AZIMUTH_HPP
106