]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/geometry/core/cs.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / geometry / core / cs.hpp
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, 2018.
8 // Modifications copyright (c) 2014-2018, Oracle and/or its affiliates.
9
10 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
11 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
12
13 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
14 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
15
16 // Use, modification and distribution is subject to the Boost Software License,
17 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
18 // http://www.boost.org/LICENSE_1_0.txt)
19
20 #ifndef BOOST_GEOMETRY_CORE_CS_HPP
21 #define BOOST_GEOMETRY_CORE_CS_HPP
22
23 #include <cstddef>
24
25 #include <boost/mpl/assert.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 define_angular_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 define_angular_units<geometry::degree>
69 {
70 typedef geometry::degree units;
71 };
72
73 template <>
74 struct define_angular_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 : core_detail::define_angular_units<DegreeOrRadian>
111 {};
112
113
114
115 /*!
116 \brief Spherical (polar) coordinate system, in degree or in radian
117 \details Defines the spherical coordinate system where points are
118 defined in two angles
119 and an optional radius usually known as r, theta, phi
120 \par Coordinates:
121 - coordinate 0:
122 0 <= phi < 2pi is the angle between the positive x-axis and the
123 line from the origin to the P projected onto the xy-plane.
124 - coordinate 1:
125 0 <= theta <= pi is the angle between the positive z-axis and the
126 line formed between the origin and P.
127 - coordinate 2 (if specified):
128 r >= 0 is the distance from the origin to a given point P.
129
130 \see http://en.wikipedia.org/wiki/Spherical_coordinates
131 \ingroup cs
132 */
133 template<typename DegreeOrRadian>
134 struct spherical
135 : core_detail::define_angular_units<DegreeOrRadian>
136 {};
137
138
139 /*!
140 \brief Spherical equatorial coordinate system, in degree or in radian
141 \details This one resembles the geographic coordinate system, and has latitude
142 up from zero at the equator, to 90 at the pole
143 (opposite to the spherical(polar) coordinate system).
144 Used in astronomy and in GIS (but there is also the geographic)
145
146 \see http://en.wikipedia.org/wiki/Spherical_coordinates
147 \ingroup cs
148 */
149 template<typename DegreeOrRadian>
150 struct spherical_equatorial
151 : core_detail::define_angular_units<DegreeOrRadian>
152 {};
153
154
155
156 /*!
157 \brief Polar coordinate system
158 \details Defines the polar coordinate system "in which each point
159 on a plane is determined by an angle and a distance"
160 \see http://en.wikipedia.org/wiki/Polar_coordinates
161 \ingroup cs
162 */
163 template<typename DegreeOrRadian>
164 struct polar
165 : core_detail::define_angular_units<DegreeOrRadian>
166 {};
167
168
169 /*!
170 \brief Undefined coordinate system
171 \ingroup cs
172 */
173 struct undefined {};
174
175
176 } // namespace cs
177
178
179 namespace traits
180 {
181
182 /*!
183 \brief Traits class defining coordinate system tag, bound to coordinate system
184 \ingroup traits
185 \tparam CoordinateSystem coordinate system
186 */
187 template <typename CoordinateSystem>
188 struct cs_tag
189 {
190 };
191
192
193 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
194
195 template<typename DegreeOrRadian>
196 struct cs_tag<cs::geographic<DegreeOrRadian> >
197 {
198 typedef geographic_tag type;
199 };
200
201 template<typename DegreeOrRadian>
202 struct cs_tag<cs::spherical<DegreeOrRadian> >
203 {
204 typedef spherical_polar_tag type;
205 };
206
207 template<typename DegreeOrRadian>
208 struct cs_tag<cs::spherical_equatorial<DegreeOrRadian> >
209 {
210 typedef spherical_equatorial_tag type;
211 };
212
213
214 template<>
215 struct cs_tag<cs::cartesian>
216 {
217 typedef cartesian_tag type;
218 };
219
220
221 template <>
222 struct cs_tag<cs::undefined>
223 {
224 typedef cs_undefined_tag type;
225 };
226
227 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
228
229
230 } // namespace traits
231
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 namespace traits
249 {
250
251 // cartesian or undefined
252 template <typename CoordinateSystem>
253 struct cs_angular_units
254 {
255 typedef geometry::radian type;
256 };
257
258 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
259
260 template<typename DegreeOrRadian>
261 struct cs_angular_units<cs::geographic<DegreeOrRadian> >
262 {
263 typedef DegreeOrRadian type;
264 };
265
266 template<typename DegreeOrRadian>
267 struct cs_angular_units<cs::spherical<DegreeOrRadian> >
268 {
269 typedef DegreeOrRadian type;
270 };
271
272 template<typename DegreeOrRadian>
273 struct cs_angular_units<cs::spherical_equatorial<DegreeOrRadian> >
274 {
275 typedef DegreeOrRadian type;
276 };
277
278 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
279
280
281 } // namespace traits
282
283
284 #ifndef DOXYGEN_NO_DETAIL
285 namespace detail
286 {
287
288 template <typename Geometry>
289 struct cs_angular_units
290 {
291 typedef typename traits::cs_angular_units
292 <
293 typename geometry::coordinate_system<Geometry>::type
294 >::type type;
295 };
296
297
298 template <typename Units, typename CsTag>
299 struct cs_tag_to_coordinate_system
300 {
301 BOOST_MPL_ASSERT_MSG((false),
302 NOT_IMPLEMENTED_FOR_THIS_COORDINATE_SYSTEM,
303 (types<CsTag>));
304 };
305
306 template <typename Units>
307 struct cs_tag_to_coordinate_system<Units, cs_undefined_tag>
308 {
309 typedef cs::undefined type;
310 };
311
312 template <typename Units>
313 struct cs_tag_to_coordinate_system<Units, cartesian_tag>
314 {
315 typedef cs::cartesian type;
316 };
317
318 template <typename Units>
319 struct cs_tag_to_coordinate_system<Units, spherical_equatorial_tag>
320 {
321 typedef cs::spherical_equatorial<Units> type;
322 };
323
324 template <typename Units>
325 struct cs_tag_to_coordinate_system<Units, spherical_polar_tag>
326 {
327 typedef cs::spherical<Units> type;
328 };
329
330 template <typename Units>
331 struct cs_tag_to_coordinate_system<Units, geographic_tag>
332 {
333 typedef cs::geographic<Units> type;
334 };
335
336 } // namespace detail
337 #endif // DOXYGEN_NO_DETAIL
338
339
340 }} // namespace boost::geometry
341
342 #endif // BOOST_GEOMETRY_CORE_CS_HPP