// Boost.Geometry // Copyright (c) 2017 Oracle and/or its affiliates. // 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_FORMULAS_AUTHALIC_RADIUS_SQR_HPP #define BOOST_GEOMETRY_FORMULAS_AUTHALIC_RADIUS_SQR_HPP #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DISPATCH namespace formula_dispatch { template ::type> struct authalic_radius_sqr : not_implemented {}; template struct authalic_radius_sqr { static inline ResultType apply(Geometry const& geometry) { return math::sqr(get_radius<0>(geometry)); } }; template struct authalic_radius_sqr { static inline ResultType apply(Geometry const& geometry) { ResultType const a2 = math::sqr(get_radius<0>(geometry)); ResultType const e2 = formula::eccentricity_sqr(geometry); return apply(a2, e2); } static inline ResultType apply(ResultType const& a2, ResultType const& e2) { ResultType const c0 = 0; if (math::equals(e2, c0)) { return a2; } ResultType const e = math::sqrt(e2); ResultType const c2 = 2; //ResultType const b2 = math::sqr(get_radius<2>(geometry)); //return a2 / c2 + b2 * boost::math::atanh(e) / (c2 * e); ResultType const c1 = 1; return (a2 / c2) * ( c1 + (c1 - e2) * boost::math::atanh(e) / e ); } }; } // namespace formula_dispatch #endif // DOXYGEN_NO_DISPATCH #ifndef DOXYGEN_NO_DETAIL namespace formula { template inline ResultType authalic_radius_sqr(Geometry const& geometry) { return formula_dispatch::authalic_radius_sqr::apply(geometry); } } // namespace formula #endif // DOXYGEN_NO_DETAIL }} // namespace boost::geometry #endif // BOOST_GEOMETRY_FORMULAS_AUTHALIC_RADIUS_SQR_HPP