Chris@16
|
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
|
Chris@16
|
4
|
Chris@16
|
5 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@16
|
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP
|
Chris@16
|
10 #define BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #if defined(HAVE_MATRIX_AS_STRING)
|
Chris@16
|
13 #include <string>
|
Chris@16
|
14 #endif
|
Chris@16
|
15
|
Chris@16
|
16 #include <cstddef>
|
Chris@16
|
17
|
Chris@16
|
18
|
Chris@101
|
19
|
Chris@16
|
20 namespace boost { namespace geometry
|
Chris@16
|
21 {
|
Chris@16
|
22
|
Chris@16
|
23 /*!
|
Chris@16
|
24 \brief Dimensionally Extended 9 Intersection Matrix
|
Chris@16
|
25 \details
|
Chris@16
|
26 \ingroup overlay
|
Chris@16
|
27 \see http://gis.hsr.ch/wiki/images/3/3d/9dem_springer.pdf
|
Chris@16
|
28 */
|
Chris@16
|
29 struct de9im
|
Chris@16
|
30 {
|
Chris@16
|
31 int ii, ib, ie,
|
Chris@16
|
32 bi, bb, be,
|
Chris@16
|
33 ei, eb, ee;
|
Chris@16
|
34
|
Chris@16
|
35 inline de9im()
|
Chris@16
|
36 : ii(-1), ib(-1), ie(-1)
|
Chris@16
|
37 , bi(-1), bb(-1), be(-1)
|
Chris@16
|
38 , ei(-1), eb(-1), ee(-1)
|
Chris@16
|
39 {
|
Chris@16
|
40 }
|
Chris@16
|
41
|
Chris@16
|
42 inline de9im(int ii0, int ib0, int ie0,
|
Chris@16
|
43 int bi0, int bb0, int be0,
|
Chris@16
|
44 int ei0, int eb0, int ee0)
|
Chris@16
|
45 : ii(ii0), ib(ib0), ie(ie0)
|
Chris@16
|
46 , bi(bi0), bb(bb0), be(be0)
|
Chris@16
|
47 , ei(ei0), eb(eb0), ee(ee0)
|
Chris@16
|
48 {}
|
Chris@16
|
49
|
Chris@16
|
50 inline bool equals() const
|
Chris@16
|
51 {
|
Chris@16
|
52 return ii >= 0 && ie < 0 && be < 0 && ei < 0 && eb < 0;
|
Chris@16
|
53 }
|
Chris@16
|
54
|
Chris@16
|
55 inline bool disjoint() const
|
Chris@16
|
56 {
|
Chris@16
|
57 return ii < 0 && ib < 0 && bi < 0 && bb < 0;
|
Chris@16
|
58 }
|
Chris@16
|
59
|
Chris@16
|
60 inline bool intersects() const
|
Chris@16
|
61 {
|
Chris@16
|
62 return ii >= 0 || bb >= 0 || bi >= 0 || ib >= 0;
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 inline bool touches() const
|
Chris@16
|
66 {
|
Chris@16
|
67 return ii < 0 && (bb >= 0 || bi >= 0 || ib >= 0);
|
Chris@16
|
68 }
|
Chris@16
|
69
|
Chris@16
|
70 inline bool crosses() const
|
Chris@16
|
71 {
|
Chris@16
|
72 return (ii >= 0 && ie >= 0) || (ii == 0);
|
Chris@16
|
73 }
|
Chris@16
|
74
|
Chris@16
|
75 inline bool overlaps() const
|
Chris@16
|
76 {
|
Chris@16
|
77 return ii >= 0 && ie >= 0 && ei >= 0;
|
Chris@16
|
78 }
|
Chris@16
|
79
|
Chris@16
|
80 inline bool within() const
|
Chris@16
|
81 {
|
Chris@16
|
82 return ii >= 0 && ie < 0 && be < 0;
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85 inline bool contains() const
|
Chris@16
|
86 {
|
Chris@16
|
87 return ii >= 0 && ei < 0 && eb < 0;
|
Chris@16
|
88 }
|
Chris@16
|
89
|
Chris@16
|
90
|
Chris@16
|
91 static inline char as_char(int v)
|
Chris@16
|
92 {
|
Chris@101
|
93 return v >= 0 && v < 10 ? static_cast<char>('0' + v) : '-';
|
Chris@16
|
94 }
|
Chris@16
|
95
|
Chris@16
|
96 #if defined(HAVE_MATRIX_AS_STRING)
|
Chris@16
|
97 inline std::string matrix_as_string(std::string const& tab, std::string const& nl) const
|
Chris@16
|
98 {
|
Chris@16
|
99 std::string ret;
|
Chris@16
|
100 ret.reserve(9 + tab.length() * 3 + nl.length() * 3);
|
Chris@16
|
101 ret += tab; ret += as_char(ii); ret += as_char(ib); ret += as_char(ie); ret += nl;
|
Chris@16
|
102 ret += tab; ret += as_char(bi); ret += as_char(bb); ret += as_char(be); ret += nl;
|
Chris@16
|
103 ret += tab; ret += as_char(ei); ret += as_char(eb); ret += as_char(ee);
|
Chris@16
|
104 return ret;
|
Chris@16
|
105 }
|
Chris@16
|
106
|
Chris@16
|
107 inline std::string matrix_as_string() const
|
Chris@16
|
108 {
|
Chris@16
|
109 return matrix_as_string("", "");
|
Chris@16
|
110 }
|
Chris@16
|
111 #endif
|
Chris@16
|
112
|
Chris@16
|
113 };
|
Chris@16
|
114
|
Chris@16
|
115 struct de9im_segment : public de9im
|
Chris@16
|
116 {
|
Chris@16
|
117 bool collinear; // true if segments are aligned (for equal,overlap,touch)
|
Chris@16
|
118 bool opposite; // true if direction is reversed (for equal,overlap,touch)
|
Chris@16
|
119 bool parallel; // true if disjoint but parallel
|
Chris@16
|
120 bool degenerate; // true for segment(s) of zero length
|
Chris@16
|
121
|
Chris@16
|
122 double ra, rb; // temp
|
Chris@16
|
123
|
Chris@16
|
124 inline de9im_segment()
|
Chris@16
|
125 : de9im()
|
Chris@16
|
126 , collinear(false)
|
Chris@16
|
127 , opposite(false)
|
Chris@16
|
128 , parallel(false)
|
Chris@16
|
129 , degenerate(false)
|
Chris@16
|
130 {}
|
Chris@16
|
131
|
Chris@16
|
132 inline de9im_segment(double a, double b,
|
Chris@16
|
133 int ii0, int ib0, int ie0,
|
Chris@16
|
134 int bi0, int bb0, int be0,
|
Chris@16
|
135 int ei0, int eb0, int ee0,
|
Chris@16
|
136 bool c = false, bool o = false, bool p = false, bool d = false)
|
Chris@16
|
137 : de9im(ii0, ib0, ie0, bi0, bb0, be0, ei0, eb0, ee0)
|
Chris@16
|
138 , collinear(c)
|
Chris@16
|
139 , opposite(o)
|
Chris@16
|
140 , parallel(p)
|
Chris@16
|
141 , degenerate(d)
|
Chris@16
|
142 , ra(a), rb(b)
|
Chris@16
|
143 {}
|
Chris@16
|
144
|
Chris@16
|
145
|
Chris@16
|
146 #if defined(HAVE_MATRIX_AS_STRING)
|
Chris@16
|
147 inline std::string as_string() const
|
Chris@16
|
148 {
|
Chris@16
|
149 std::string ret = matrix_as_string();
|
Chris@16
|
150 ret += collinear ? "c" : "-";
|
Chris@16
|
151 ret += opposite ? "o" : "-";
|
Chris@16
|
152 return ret;
|
Chris@16
|
153 }
|
Chris@16
|
154 #endif
|
Chris@16
|
155 };
|
Chris@16
|
156
|
Chris@101
|
157 template <typename SegmentRatio>
|
Chris@101
|
158 struct fraction_type
|
Chris@101
|
159 {
|
Chris@101
|
160 SegmentRatio robust_ra; // TODO this can be renamed now to "ra"
|
Chris@101
|
161 SegmentRatio robust_rb;
|
Chris@16
|
162
|
Chris@101
|
163 bool initialized;
|
Chris@101
|
164 inline fraction_type()
|
Chris@101
|
165 : initialized(false)
|
Chris@101
|
166 {}
|
Chris@16
|
167
|
Chris@101
|
168 template <typename Info>
|
Chris@101
|
169 inline void assign(Info const& info)
|
Chris@101
|
170 {
|
Chris@101
|
171 initialized = true;
|
Chris@101
|
172 robust_ra = info.robust_ra;
|
Chris@101
|
173 robust_rb = info.robust_rb;
|
Chris@101
|
174 }
|
Chris@101
|
175
|
Chris@101
|
176 inline void assign(SegmentRatio const& a, SegmentRatio const& b)
|
Chris@101
|
177 {
|
Chris@101
|
178 initialized = true;
|
Chris@101
|
179 robust_ra = a;
|
Chris@101
|
180 robust_rb = b;
|
Chris@101
|
181 }
|
Chris@101
|
182
|
Chris@101
|
183 };
|
Chris@101
|
184
|
Chris@101
|
185 //
|
Chris@101
|
186 /*!
|
Chris@101
|
187 \brief return-type for segment-intersection
|
Chris@101
|
188 \note Set in intersection_points.hpp, from segment_intersection_info
|
Chris@101
|
189 */
|
Chris@101
|
190 template <typename Point, typename SegmentRatio>
|
Chris@16
|
191 struct segment_intersection_points
|
Chris@16
|
192 {
|
Chris@101
|
193 std::size_t count; // The number of intersection points
|
Chris@101
|
194
|
Chris@101
|
195 // TODO: combine intersections and fractions in one struct
|
Chris@16
|
196 Point intersections[2];
|
Chris@101
|
197 fraction_type<SegmentRatio> fractions[2];
|
Chris@16
|
198 typedef Point point_type;
|
Chris@16
|
199
|
Chris@16
|
200 segment_intersection_points()
|
Chris@16
|
201 : count(0)
|
Chris@16
|
202 {}
|
Chris@16
|
203 };
|
Chris@16
|
204
|
Chris@101
|
205 // All assigned in cart_intersect, passed to intersection_points
|
Chris@101
|
206 template <typename CoordinateType, typename PromotedType, typename SegmentRatio>
|
Chris@101
|
207 struct segment_intersection_info
|
Chris@101
|
208 {
|
Chris@101
|
209 typedef PromotedType promoted_type;
|
Chris@101
|
210
|
Chris@101
|
211 CoordinateType dx_a, dy_a;
|
Chris@101
|
212 CoordinateType dx_b, dy_b; // TODO b can be removed
|
Chris@101
|
213 SegmentRatio robust_ra;
|
Chris@101
|
214 SegmentRatio robust_rb;
|
Chris@101
|
215 };
|
Chris@101
|
216
|
Chris@16
|
217
|
Chris@16
|
218 }} // namespace boost::geometry
|
Chris@16
|
219
|
Chris@16
|
220
|
Chris@16
|
221 #endif // BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP
|