summaryrefslogtreecommitdiff
path: root/boost/geometry/strategies/geographic/area.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/strategies/geographic/area.hpp')
-rw-r--r--boost/geometry/strategies/geographic/area.hpp36
1 files changed, 11 insertions, 25 deletions
diff --git a/boost/geometry/strategies/geographic/area.hpp b/boost/geometry/strategies/geographic/area.hpp
index 44dc2e6945..40d6c8243e 100644
--- a/boost/geometry/strategies/geographic/area.hpp
+++ b/boost/geometry/strategies/geographic/area.hpp
@@ -15,12 +15,11 @@
#include <boost/geometry/core/srs.hpp>
#include <boost/geometry/formulas/area_formulas.hpp>
-#include <boost/geometry/formulas/flattening.hpp>
+#include <boost/geometry/formulas/authalic_radius_sqr.hpp>
+#include <boost/geometry/formulas/eccentricity_sqr.hpp>
#include <boost/geometry/strategies/geographic/parameters.hpp>
-#include <boost/math/special_functions/atanh.hpp>
-
namespace boost { namespace geometry
{
@@ -88,31 +87,16 @@ protected :
inline spheroid_constants(Spheroid const& spheroid)
: m_spheroid(spheroid)
, m_a2(math::sqr(get_radius<0>(spheroid)))
- , m_e2(formula::flattening<CT>(spheroid)
- * (CT(2.0) - CT(formula::flattening<CT>(spheroid))))
+ , m_e2(formula::eccentricity_sqr<CT>(spheroid))
, m_ep2(m_e2 / (CT(1.0) - m_e2))
, m_ep(math::sqrt(m_ep2))
- , m_c2(authalic_radius(spheroid, m_a2, m_e2))
+ , m_c2(formula_dispatch::authalic_radius_sqr
+ <
+ CT, Spheroid, srs_spheroid_tag
+ >::apply(m_a2, m_e2))
{}
};
- static inline CT authalic_radius(Spheroid const& sph, CT const& a2, CT const& e2)
- {
- CT const c0 = 0;
-
- if (math::equals(e2, c0))
- {
- return a2;
- }
-
- CT const sqrt_e2 = math::sqrt(e2);
- CT const c2 = 2;
-
- return (a2 / c2) +
- ((math::sqr(get_radius<2>(sph)) * boost::math::atanh(sqrt_e2))
- / (c2 * sqrt_e2));
- }
-
struct area_sums
{
CT m_excess_sum;
@@ -190,8 +174,10 @@ public :
state.m_correction_sum += result.ellipsoidal_term;
// Keep track whenever a segment crosses the prime meridian
- geometry::formula::area_formulas<CT>
- ::crosses_prime_meridian(p1, p2, state);
+ if (area_formulas::crosses_prime_meridian(p1, p2))
+ {
+ state.m_crosses_prime_meridian++;
+ }
}
}