1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. 4 // Copyright (c) 2008-2014 Bruno Lalande, Paris, France. 5 // Copyright (c) 2009-2014 Mateusz Loskot, London, UK. 6 7 // This file was modified by Oracle on 2014. 8 // Modifications copyright (c) 2014, Oracle and/or its affiliates. 9 10 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 11 12 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library 13 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. 14 15 // Use, modification and distribution is subject to the Boost Software License, 16 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 17 // http://www.boost.org/LICENSE_1_0.txt) 18 19 #ifndef BOOST_GEOMETRY_CORE_CS_HPP 20 #define BOOST_GEOMETRY_CORE_CS_HPP 21 22 #include <cstddef> 23 24 #include <boost/mpl/assert.hpp> 25 #include <boost/type_traits/integral_constant.hpp> 26 27 #include <boost/geometry/core/coordinate_system.hpp> 28 #include <boost/geometry/core/tags.hpp> 29 30 31 namespace boost { namespace geometry 32 { 33 34 /*! 35 \brief Unit of plane angle: Degrees 36 \details Tag defining the unit of plane angle for spherical coordinate systems. 37 This tag specifies that coordinates are defined in degrees (-180 .. 180). 38 It has to be specified for some coordinate systems. 39 \qbk{[include reference/core/degree_radian.qbk]} 40 */ 41 struct degree {}; 42 43 44 /*! 45 \brief Unit of plane angle: Radians 46 \details Tag defining the unit of plane angle for spherical coordinate systems. 47 This tag specifies that coordinates are defined in radians (-PI .. PI). 48 It has to be specified for some coordinate systems. 49 \qbk{[include reference/core/degree_radian.qbk]} 50 */ 51 struct radian {}; 52 53 54 #ifndef DOXYGEN_NO_DETAIL 55 namespace core_detail 56 { 57 58 template <typename DegreeOrRadian> 59 struct coordinate_system_units 60 { 61 BOOST_MPL_ASSERT_MSG 62 ((false), 63 COORDINATE_SYSTEM_UNITS_MUST_BE_DEGREES_OR_RADIANS, 64 (types<DegreeOrRadian>)); 65 }; 66 67 template <> 68 struct coordinate_system_units<geometry::degree> 69 { 70 typedef geometry::degree units; 71 }; 72 73 template <> 74 struct coordinate_system_units<geometry::radian> 75 { 76 typedef geometry::radian units; 77 }; 78 79 } // namespace core_detail 80 #endif // DOXYGEN_NO_DETAIL 81 82 83 namespace cs 84 { 85 86 /*! 87 \brief Cartesian coordinate system 88 \details Defines the Cartesian or rectangular coordinate system 89 where points are defined in 2 or 3 (or more) 90 dimensions and usually (but not always) known as x,y,z 91 \see http://en.wikipedia.org/wiki/Cartesian_coordinate_system 92 \ingroup cs 93 */ 94 struct cartesian {}; 95 96 97 98 99 /*! 100 \brief Geographic coordinate system, in degree or in radian 101 \details Defines the geographic coordinate system where points 102 are defined in two angles and usually 103 known as lat,long or lo,la or phi,lambda 104 \see http://en.wikipedia.org/wiki/Geographic_coordinate_system 105 \ingroup cs 106 \note might be moved to extensions/gis/geographic 107 */ 108 template<typename DegreeOrRadian> 109 struct geographic 110 { 111 typedef typename core_detail::coordinate_system_units 112 < 113 DegreeOrRadian 114 >::units units; 115 }; 116 117 118 119 /*! 120 \brief Spherical (polar) coordinate system, in degree or in radian 121 \details Defines the spherical coordinate system where points are 122 defined in two angles 123 and an optional radius usually known as r, theta, phi 124 \par Coordinates: 125 - coordinate 0: 126 0 <= phi < 2pi is the angle between the positive x-axis and the 127 line from the origin to the P projected onto the xy-plane. 128 - coordinate 1: 129 0 <= theta <= pi is the angle between the positive z-axis and the 130 line formed between the origin and P. 131 - coordinate 2 (if specified): 132 r >= 0 is the distance from the origin to a given point P. 133 134 \see http://en.wikipedia.org/wiki/Spherical_coordinates 135 \ingroup cs 136 */ 137 template<typename DegreeOrRadian> 138 struct spherical 139 { 140 typedef typename core_detail::coordinate_system_units 141 < 142 DegreeOrRadian 143 >::units units; 144 }; 145 146 147 /*! 148 \brief Spherical equatorial coordinate system, in degree or in radian 149 \details This one resembles the geographic coordinate system, and has latitude 150 up from zero at the equator, to 90 at the pole 151 (opposite to the spherical(polar) coordinate system). 152 Used in astronomy and in GIS (but there is also the geographic) 153 154 \see http://en.wikipedia.org/wiki/Spherical_coordinates 155 \ingroup cs 156 */ 157 template<typename DegreeOrRadian> 158 struct spherical_equatorial 159 { 160 typedef typename core_detail::coordinate_system_units 161 < 162 DegreeOrRadian 163 >::units units; 164 }; 165 166 167 168 /*! 169 \brief Polar coordinate system 170 \details Defines the polar coordinate system "in which each point 171 on a plane is determined by an angle and a distance" 172 \see http://en.wikipedia.org/wiki/Polar_coordinates 173 \ingroup cs 174 */ 175 template<typename DegreeOrRadian> 176 struct polar 177 { 178 typedef typename core_detail::coordinate_system_units 179 < 180 DegreeOrRadian 181 >::units units; 182 }; 183 184 185 } // namespace cs 186 187 188 namespace traits 189 { 190 191 /*! 192 \brief Traits class defining coordinate system tag, bound to coordinate system 193 \ingroup traits 194 \tparam CoordinateSystem coordinate system 195 */ 196 template <typename CoordinateSystem> 197 struct cs_tag 198 { 199 }; 200 201 202 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS 203 204 template<typename DegreeOrRadian> 205 struct cs_tag<cs::geographic<DegreeOrRadian> > 206 { 207 typedef geographic_tag type; 208 }; 209 210 template<typename DegreeOrRadian> 211 struct cs_tag<cs::spherical<DegreeOrRadian> > 212 { 213 typedef spherical_polar_tag type; 214 }; 215 216 template<typename DegreeOrRadian> 217 struct cs_tag<cs::spherical_equatorial<DegreeOrRadian> > 218 { 219 typedef spherical_equatorial_tag type; 220 }; 221 222 223 template<> 224 struct cs_tag<cs::cartesian> 225 { 226 typedef cartesian_tag type; 227 }; 228 229 230 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS 231 } // namespace traits 232 233 /*! 234 \brief Meta-function returning coordinate system tag (cs family) of any geometry 235 \tparam Geometry \tparam_geometry 236 \ingroup core 237 */ 238 template <typename Geometry> 239 struct cs_tag 240 { 241 typedef typename traits::cs_tag 242 < 243 typename geometry::coordinate_system<Geometry>::type 244 >::type type; 245 }; 246 247 248 /*! 249 \brief Meta-function to verify if a coordinate system is radian 250 \tparam CoordinateSystem Any coordinate system. 251 \ingroup core 252 */ 253 template <typename CoordinateSystem> 254 struct is_radian : boost::true_type {}; 255 256 257 #ifndef DOXYGEN_NO_SPECIALIZATIONS 258 259 // Specialization for any degree coordinate systems 260 template <template<typename> class CoordinateSystem> 261 struct is_radian< CoordinateSystem<degree> > : boost::false_type 262 { 263 }; 264 265 #endif // DOXYGEN_NO_SPECIALIZATIONS 266 267 }} // namespace boost::geometry 268 269 #endif // BOOST_GEOMETRY_CORE_CS_HPP 270