Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:35:47

0001 // Boost.Geometry - gis-projections (based on PROJ4)
0002 
0003 // Copyright (c) 2008-2015 Barend Gehrels, Amsterdam, the Netherlands.
0004 
0005 // This file was modified by Oracle on 2017, 2018, 2019.
0006 // Modifications copyright (c) 2017-2019, Oracle and/or its affiliates.
0007 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle.
0008 
0009 // Use, modification and distribution is subject to the Boost Software License,
0010 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0011 // http://www.boost.org/LICENSE_1_0.txt)
0012 
0013 // This file is converted from PROJ4, http://trac.osgeo.org/proj
0014 // PROJ4 is originally written by Gerald Evenden (then of the USGS)
0015 // PROJ4 is maintained by Frank Warmerdam
0016 // PROJ4 is converted to Boost.Geometry by Barend Gehrels
0017 
0018 // Last updated version of proj: 5.0.0
0019 
0020 // Original copyright notice:
0021 
0022 // Permission is hereby granted, free of charge, to any person obtaining a
0023 // copy of this software and associated documentation files (the "Software"),
0024 // to deal in the Software without restriction, including without limitation
0025 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
0026 // and/or sell copies of the Software, and to permit persons to whom the
0027 // Software is furnished to do so, subject to the following conditions:
0028 
0029 // The above copyright notice and this permission notice shall be included
0030 // in all copies or substantial portions of the Software.
0031 
0032 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
0033 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0034 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
0035 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0036 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0037 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0038 // DEALINGS IN THE SOFTWARE.
0039 
0040 #ifndef BOOST_GEOMETRY_PROJECTIONS_VANDG4_HPP
0041 #define BOOST_GEOMETRY_PROJECTIONS_VANDG4_HPP
0042 
0043 #include <boost/geometry/util/math.hpp>
0044 
0045 #include <boost/geometry/srs/projections/impl/base_static.hpp>
0046 #include <boost/geometry/srs/projections/impl/base_dynamic.hpp>
0047 #include <boost/geometry/srs/projections/impl/projects.hpp>
0048 #include <boost/geometry/srs/projections/impl/factory_entry.hpp>
0049 
0050 namespace boost { namespace geometry
0051 {
0052 
0053 namespace projections
0054 {
0055     #ifndef DOXYGEN_NO_DETAIL
0056     namespace detail { namespace vandg4
0057     {
0058 
0059             static const double tolerance = 1e-10;
0060 
0061             template <typename T, typename Parameters>
0062             struct base_vandg4_spheroid
0063             {
0064                 // FORWARD(s_forward)  spheroid
0065                 // Project coordinates from geographic (lon, lat) to cartesian (x, y)
0066                 inline void fwd(Parameters const& , T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const
0067                 {
0068                     static const T half_pi = detail::half_pi<T>();
0069                     static const T two_div_pi = detail::two_div_pi<T>();
0070 
0071                     T x1, t, bt, ct, ft, bt2, ct2, dt, dt2;
0072 
0073                     if (fabs(lp_lat) < tolerance) {
0074                         xy_x = lp_lon;
0075                         xy_y = 0.;
0076                     } else if (fabs(lp_lon) < tolerance || fabs(fabs(lp_lat) - half_pi) < tolerance) {
0077                         xy_x = 0.;
0078                         xy_y = lp_lat;
0079                     } else {
0080                         bt = fabs(two_div_pi * lp_lat);
0081                         bt2 = bt * bt;
0082                         ct = 0.5 * (bt * (8. - bt * (2. + bt2)) - 5.)
0083                             / (bt2 * (bt - 1.));
0084                         ct2 = ct * ct;
0085                         dt = two_div_pi * lp_lon;
0086                         dt = dt + 1. / dt;
0087                         dt = sqrt(dt * dt - 4.);
0088                         if ((fabs(lp_lon) - half_pi) < 0.) dt = -dt;
0089                         dt2 = dt * dt;
0090                         x1 = bt + ct; x1 *= x1;
0091                         t = bt + 3.*ct;
0092                         ft = x1 * (bt2 + ct2 * dt2 - 1.) + (1.-bt2) * (
0093                             bt2 * (t * t + 4. * ct2) +
0094                             ct2 * (12. * bt * ct + 4. * ct2) );
0095                         x1 = (dt*(x1 + ct2 - 1.) + 2.*sqrt(ft)) /
0096                             (4.* x1 + dt2);
0097                         xy_x = half_pi * x1;
0098                         xy_y = half_pi * sqrt(1. + dt * fabs(x1) - x1 * x1);
0099                         if (lp_lon < 0.) xy_x = -xy_x;
0100                         if (lp_lat < 0.) xy_y = -xy_y;
0101                     }
0102                 }
0103 
0104                 static inline std::string get_name()
0105                 {
0106                     return "vandg4_spheroid";
0107                 }
0108 
0109             };
0110 
0111             // van der Grinten IV
0112             template <typename Parameters>
0113             inline void setup_vandg4(Parameters& par)
0114             {
0115                 par.es = 0.;
0116             }
0117 
0118     }} // namespace detail::vandg4
0119     #endif // doxygen
0120 
0121     /*!
0122         \brief van der Grinten IV projection
0123         \ingroup projections
0124         \tparam Geographic latlong point type
0125         \tparam Cartesian xy point type
0126         \tparam Parameters parameter type
0127         \par Projection characteristics
0128          - Miscellaneous
0129          - Spheroid
0130          - no inverse
0131         \par Example
0132         \image html ex_vandg4.gif
0133     */
0134     template <typename T, typename Parameters>
0135     struct vandg4_spheroid : public detail::vandg4::base_vandg4_spheroid<T, Parameters>
0136     {
0137         template <typename Params>
0138         inline vandg4_spheroid(Params const& , Parameters & par)
0139         {
0140             detail::vandg4::setup_vandg4(par);
0141         }
0142     };
0143 
0144     #ifndef DOXYGEN_NO_DETAIL
0145     namespace detail
0146     {
0147 
0148         // Static projection
0149         BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_F(srs::spar::proj_vandg4, vandg4_spheroid)
0150 
0151         // Factory entry(s)
0152         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_F(vandg4_entry, vandg4_spheroid)
0153 
0154         BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(vandg4_init)
0155         {
0156             BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(vandg4, vandg4_entry)
0157         }
0158 
0159     } // namespace detail
0160     #endif // doxygen
0161 
0162 } // namespace projections
0163 
0164 }} // namespace boost::geometry
0165 
0166 #endif // BOOST_GEOMETRY_PROJECTIONS_VANDG4_HPP
0167