123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #ifndef BOOST_GEOMETRY_FORMULAS_QUARTER_MERIDIAN_HPP
- #define BOOST_GEOMETRY_FORMULAS_QUARTER_MERIDIAN_HPP
- #include <boost/geometry/algorithms/not_implemented.hpp>
- #include <boost/geometry/core/radius.hpp>
- #include <boost/geometry/core/tag.hpp>
- #include <boost/geometry/core/tags.hpp>
- #include <boost/geometry/formulas/flattening.hpp>
- #include <boost/geometry/util/math.hpp>
- namespace boost { namespace geometry
- {
- #ifndef DOXYGEN_NO_DISPATCH
- namespace formula_dispatch
- {
- template <typename ResultType, typename Geometry, typename Tag = typename tag<Geometry>::type>
- struct quarter_meridian
- : not_implemented<Tag>
- {};
- template <typename ResultType, typename Geometry>
- struct quarter_meridian<ResultType, Geometry, srs_spheroid_tag>
- {
-
-
- static inline ResultType apply(Geometry const& geometry)
- {
-
- ResultType const C[] =
- {
- 1073741824,
- 268435456,
- 16777216,
- 4194304,
- 1638400,
- 802816,
- 451584,
- 278784,
- 184041
- };
- ResultType const c2 = 2;
- ResultType const c4 = 4;
- ResultType const f = formula::flattening<ResultType>(geometry);
- ResultType const n = f / (c2 - f);
- ResultType const ab4 = (get_radius<0>(geometry)
- + get_radius<2>(geometry)) / c4;
- return geometry::math::pi<ResultType>() * ab4 *
- horner_evaluate(n*n, C, C+8) / C[0];
- }
- private :
-
-
-
- template <typename NT, typename IteratorType>
- static inline NT horner_evaluate(NT x,
- IteratorType begin,
- IteratorType end)
- {
- NT result(0);
- if (begin == end)
- {
- return result;
- }
- IteratorType it = end;
- do
- {
- result = result * x + *--it;
- }
- while (it != begin);
- return result;
- }
- };
- }
- #endif
- #ifndef DOXYGEN_NO_DETAIL
- namespace formula
- {
- template <typename ResultType, typename Geometry>
- ResultType quarter_meridian(Geometry const& geometry)
- {
- return formula_dispatch::quarter_meridian<ResultType, Geometry>::apply(geometry);
- }
- }
- #endif
- }}
- #endif
|