1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
---|---|

2 | |

3 | // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. |

4 | // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. |

5 | // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. |

6 | |

7 | // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library |

8 | // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. |

9 | |

10 | // Use, modification and distribution is subject to the Boost Software License, |

11 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |

12 | // http://www.boost.org/LICENSE_1_0.txt) |

13 | |

14 | #ifndef BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |

15 | #define BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |

16 | |

17 | #include <cstddef> |

18 | |

19 | #include <boost/concept/assert.hpp> |

20 | #include <boost/config.hpp> |

21 | |

22 | #include <boost/geometry/algorithms/convert.hpp> |

23 | #include <boost/geometry/geometries/concepts/point_concept.hpp> |

24 | |

25 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

26 | #include <boost/geometry/core/assert.hpp> |

27 | #endif |

28 | |

29 | |

30 | namespace boost { namespace geometry |

31 | { |

32 | |

33 | namespace model |

34 | { |

35 | |

36 | /*! |

37 | \brief Class box: defines a box made of two describing points |

38 | \ingroup geometries |

39 | \details Box is always described by a min_corner() and a max_corner() point. If another |

40 | rectangle is used, use linear_ring or polygon. |

41 | \note Boxes are for selections and for calculating the envelope of geometries. Not all algorithms |

42 | are implemented for box. Boxes are also used in Spatial Indexes. |

43 | \tparam Point point type. The box takes a point type as template parameter. |

44 | The point type can be any point type. |

45 | It can be 2D but can also be 3D or more dimensional. |

46 | The box can also take a latlong point type as template parameter. |

47 | |

48 | \qbk{[include reference/geometries/box.qbk]} |

49 | \qbk{before.synopsis, [heading Model of]} |

50 | \qbk{before.synopsis, [link geometry.reference.concepts.concept_box Box Concept]} |

51 | */ |

52 | |

53 | template<typename Point> |

54 | class box |

55 | { |

56 | BOOST_CONCEPT_ASSERT( (concept::Point<Point>) ); |

57 | |

58 | public: |

59 | |

60 | #if !defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

61 | #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) |

62 | /// \constructor_default_no_init |

63 | box() = default; |

64 | #else |

65 | /// \constructor_default_no_init |

66 | inline box() |

67 | {} |

68 | #endif |

69 | #else // defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

70 | inline box() |

71 | { |

72 | m_created = 1; |

73 | } |

74 | ~box() |

75 | { |

76 | m_created = 0; |

77 | } |

78 | #endif |

79 | |

80 | /*! |

81 | \brief Constructor taking the minimum corner point and the maximum corner point |

82 | */ |

83 | inline box(Point const& min_corner, Point const& max_corner) |

84 | { |

85 | geometry::convert(min_corner, m_min_corner); |

86 | geometry::convert(max_corner, m_max_corner); |

87 | |

88 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

89 | m_created = 1; |

90 | #endif |

91 | } |

92 | |

93 | inline Point const& min_corner() const |

94 | { |

95 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

96 | BOOST_GEOMETRY_ASSERT(m_created == 1); |

97 | #endif |

98 | return m_min_corner; |

99 | } |

100 | inline Point const& max_corner() const |

101 | { |

102 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

103 | BOOST_GEOMETRY_ASSERT(m_created == 1); |

104 | #endif |

105 | return m_max_corner; |

106 | } |

107 | |

108 | inline Point& min_corner() |

109 | { |

110 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

111 | BOOST_GEOMETRY_ASSERT(m_created == 1); |

112 | #endif |

113 | return m_min_corner; |

114 | } |

115 | inline Point& max_corner() |

116 | { |

117 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

118 | BOOST_GEOMETRY_ASSERT(m_created == 1); |

119 | #endif |

120 | return m_max_corner; |

121 | } |

122 | |

123 | private: |

124 | |

125 | Point m_min_corner; |

126 | Point m_max_corner; |

127 | |

128 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |

129 | int m_created; |

130 | #endif |

131 | }; |

132 | |

133 | |

134 | } // namespace model |

135 | |

136 | |

137 | // Traits specializations for box above |

138 | #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS |

139 | namespace traits |

140 | { |

141 | |

142 | template <typename Point> |

143 | struct tag<model::box<Point> > |

144 | { |

145 | typedef box_tag type; |

146 | }; |

147 | |

148 | template <typename Point> |

149 | struct point_type<model::box<Point> > |

150 | { |

151 | typedef Point type; |

152 | }; |

153 | |

154 | template <typename Point, std::size_t Dimension> |

155 | struct indexed_access<model::box<Point>, min_corner, Dimension> |

156 | { |

157 | typedef typename geometry::coordinate_type<Point>::type coordinate_type; |

158 | |

159 | static inline coordinate_type get(model::box<Point> const& b) |

160 | { |

161 | return geometry::get<Dimension>(b.min_corner()); |

162 | } |

163 | |

164 | static inline void set(model::box<Point>& b, coordinate_type const& value) |

165 | { |

166 | geometry::set<Dimension>(b.min_corner(), value); |

167 | } |

168 | }; |

169 | |

170 | template <typename Point, std::size_t Dimension> |

171 | struct indexed_access<model::box<Point>, max_corner, Dimension> |

172 | { |

173 | typedef typename geometry::coordinate_type<Point>::type coordinate_type; |

174 | |

175 | static inline coordinate_type get(model::box<Point> const& b) |

176 | { |

177 | return geometry::get<Dimension>(b.max_corner()); |

178 | } |

179 | |

180 | static inline void set(model::box<Point>& b, coordinate_type const& value) |

181 | { |

182 | geometry::set<Dimension>(b.max_corner(), value); |

183 | } |

184 | }; |

185 | |

186 | } // namespace traits |

187 | #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS |

188 | |

189 | }} // namespace boost::geometry |

190 | |

191 | #endif // BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |

192 |