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 |