| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | // Boost.Geometry (aka GGL, Generic Geometry Library)// Copyright (c) 2016-2017 Oracle and/or its affiliates.// Contributed and/or modified by Vissarion Fisikopoulos, on behalf of Oracle// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle// 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_STRATEGIES_GEOGRAPHIC_AZIMUTH_HPP#define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_AZIMUTH_HPP#include <boost/geometry/srs/spheroid.hpp>#include <boost/geometry/strategies/azimuth.hpp>#include <boost/geometry/strategies/geographic/parameters.hpp>#include <boost/mpl/if.hpp>#include <boost/type_traits/is_void.hpp>namespace boost { namespace geometry{namespace strategy { namespace azimuth{template<    typename FormulaPolicy = strategy::andoyer,    typename Spheroid = srs::spheroid<double>,    typename CalculationType = void>class geographic{public :    typedef Spheroid model_type;    inline geographic()        : m_spheroid()    {}    explicit inline geographic(Spheroid const& spheroid)        : m_spheroid(spheroid)    {}    inline model_type const& model() const    {        return m_spheroid;    }    template <typename T>    inline void apply(T const& lon1_rad, T const& lat1_rad,                      T const& lon2_rad, T const& lat2_rad,                      T& a1, T& a2) const    {        compute<true, true>(lon1_rad, lat1_rad,                            lon2_rad, lat2_rad,                            a1, a2);    }    template <typename T>    inline void apply(T const& lon1_rad, T const& lat1_rad,                      T const& lon2_rad, T const& lat2_rad,                      T& a1) const    {        compute<true, false>(lon1_rad, lat1_rad,                             lon2_rad, lat2_rad,                             a1, a1);    }    template <typename T>    inline void apply_reverse(T const& lon1_rad, T const& lat1_rad,                              T const& lon2_rad, T const& lat2_rad,                              T& a2) const    {        compute<false, true>(lon1_rad, lat1_rad,                             lon2_rad, lat2_rad,                             a2, a2);    }private :    template <        bool EnableAzimuth,        bool EnableReverseAzimuth,        typename T    >    inline void compute(T const& lon1_rad, T const& lat1_rad,                        T const& lon2_rad, T const& lat2_rad,                        T& a1, T& a2) const    {        typedef typename boost::mpl::if_            <                boost::is_void<CalculationType>, T, CalculationType            >::type calc_t;        typedef typename FormulaPolicy::template inverse        <            calc_t,            false,            EnableAzimuth,            EnableReverseAzimuth,            false,            false        > inverse_type;        typedef typename inverse_type::result_type inverse_result;        inverse_result i_res = inverse_type::apply(calc_t(lon1_rad), calc_t(lat1_rad),                                                   calc_t(lon2_rad), calc_t(lat2_rad),                                                   m_spheroid);        if (EnableAzimuth)        {            a1 = i_res.azimuth;        }        if (EnableReverseAzimuth)        {            a2 = i_res.reverse_azimuth;        }    }    Spheroid m_spheroid;};#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONSnamespace services{template <typename CalculationType>struct default_strategy<geographic_tag, CalculationType>{    typedef strategy::azimuth::geographic        <            strategy::andoyer,            srs::spheroid<double>,            CalculationType        > type;};}#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS}} // namespace strategy::azimuth}} // namespace boost::geometry#endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_AZIMUTH_HPP
 |