Ticket #7984: test_boost_polygon.cpp

File test_boost_polygon.cpp, 8.4 KB (added by jp.charras@…, 10 years ago)

sample which generate bad polygon difference, or crashes (see comments inside the sample)

Line 
1#include <vector>
2#include <boost/polygon/polygon.hpp>
3
4#include <stdio.h>
5
6// Define some types used here from boost::polygon
7namespace bpl = boost::polygon; // bpl = boost polygon library
8using namespace bpl::operators; // +, -, =, ...
9
10// Definitions needed by boost::polygon
11typedef int coordinate_type;
12
13/**
14 * KI_POLYGON defines a single polygon ( boost::polygon_data type.
15 * When holes are created in a KPolygon, they are
16 * linked to main outline by overlapping segments,
17 * so there is always one polygon and one list of corners
18 * coordinates are int
19 */
20typedef bpl::polygon_data<int> KI_POLYGON;
21
22/**
23 * KI_POLYGON_SET defines a set of single KI_POLYGON.
24 * A KI_POLYGON_SET is used to store a set of polygons
25 * when performing operations between 2 polygons
26 * or 2 sets of polygons
27 * The result of operations like and, xor... between 2 polygons
28 * is always stored in a KI_POLYGON_SET, because these operations
29 * can create many polygons
30 */
31typedef std::vector<KI_POLYGON> KI_POLYGON_SET;
32
33/**
34 * KI_POLY_POINT defines a point for boost::polygon.
35 * KI_POLY_POINT store x and y coordinates (int)
36 */
37typedef bpl::point_data<int> KI_POLY_POINT;
38
39
40// This polygon creates a 0 corner polygon
41// After polys_data_holes is substracted.
42int polys_data_main_bad_results[]=
43{
44 62611000, 88265000, 0,
45 44450000, 88265000, 0,
46 44450000, 75692000, 0,
47 44391996, 75400395, 0,
48 44226815, 75153185, 0,
49 43979605, 74988004, 0,
50 43688000, 74930000, 0,
51 38683924, 74930000, 0,
52 38683924, 74360520, 0,
53 38655146, 73830802, 0,
54 38507798, 73475072, 0,
55 38272186, 73413419, 0,
56 38092581, 73593024, 0,
57 38092581, 73233814, 0,
58 38030928, 72998202, 0,
59 37530520, 72822076, 0,
60 37000802, 72850854, 0,
61 36645072, 72998202, 0,
62 36583419, 73233814, 0,
63 37338000, 73988395, 0,
64 38092581, 73233814, 0,
65 38092581, 73593024, 0,
66 37517605, 74168000, 0,
67 38272186, 74922581, 0,
68 38507798, 74860928, 0,
69 38683924, 74360520, 0,
70 38683924, 74930000, 0,
71 37920395, 74930000, 0,
72 37338000, 74347605, 0,
73 37158395, 74527209, 0,
74 37158395, 74168000, 0,
75 36403814, 73413419, 0,
76 36168202, 73475072, 0,
77 35992076, 73975480, 0,
78 36020854, 74505198, 0,
79 36168202, 74860928, 0,
80 36403814, 74922581, 0,
81 37158395, 74168000, 0,
82 37158395, 74527209, 0,
83 36755604, 74930000, 0,
84 36068000, 74930000, 0,
85 35776395, 74988004, 0,
86 35529185, 75153185, 0,
87 35364004, 75400395, 0,
88 35306000, 75692000, 0,
89 35364004, 75983605, 0,
90 35529185, 76230815, 0,
91 35776395, 76395996, 0,
92 36068000, 76454000, 0,
93 43688000, 76454000, 0,
94 43979605, 76395996, 0,
95 44226815, 76230815, 0,
96 44391996, 75983605, 0,
97 44450000, 75692000, 0,
98 44450000, 88265000, 0,
99 27305000, 88265000, 0,
100 27305000, 67691000, 0,
101 62611000, 67691000, 0,
102 62611000, 88265000, 2,
103};
104
105// This polygon creates a memory error (crash
106// when polys_data_holes is substracted.
107int polys_data_main_crash[]=
108{
109 62611000, 88265000, 0,
110 53923924, 88265000, 0,
111 53923924, 74360520, 0,
112 53895146, 73830802, 0,
113 53747798, 73475072, 0,
114 53512186, 73413419, 0,
115 53332581, 73593024, 0,
116 53332581, 73233814, 0,
117 53270928, 72998202, 0,
118 52770520, 72822076, 0,
119 52240802, 72850854, 0,
120 51885072, 72998202, 0,
121 51823419, 73233814, 0,
122 52578000, 73988395, 0,
123 53332581, 73233814, 0,
124 53332581, 73593024, 0,
125 52757605, 74168000, 0,
126 53512186, 74922581, 0,
127 53747798, 74860928, 0,
128 53923924, 74360520, 0,
129 53923924, 88265000, 0,
130 53332581, 88265000, 0,
131 53332581, 75102186, 0,
132 52578000, 74347605, 0,
133 52398395, 74527210, 0,
134 52398395, 74168000, 0,
135 51643814, 73413419, 0,
136 51408202, 73475072, 0,
137 51232076, 73975480, 0,
138 51260854, 74505198, 0,
139 51408202, 74860928, 0,
140 51643814, 74922581, 0,
141 52398395, 74168000, 0,
142 52398395, 74527210, 0,
143 51823419, 75102186, 0,
144 51885072, 75337798, 0,
145 52385480, 75513924, 0,
146 52915198, 75485146, 0,
147 53270928, 75337798, 0,
148 53332581, 75102186, 0,
149 53332581, 88265000, 0,
150 44450000, 88265000, 0,
151 44450000, 75692000, 0,
152 44391996, 75400395, 0,
153 44226815, 75153185, 0,
154 43979605, 74988004, 0,
155 43688000, 74930000, 0,
156 38683924, 74930000, 0,
157 38683924, 74360520, 0,
158 38655146, 73830802, 0,
159 38507798, 73475072, 0,
160 38272186, 73413419, 0,
161 38092581, 73593024, 0,
162 38092581, 73233814, 0,
163 38030928, 72998202, 0,
164 37530520, 72822076, 0,
165 37000802, 72850854, 0,
166 36645072, 72998202, 0,
167 36583419, 73233814, 0,
168 37338000, 73988395, 0,
169 38092581, 73233814, 0,
170 38092581, 73593024, 0,
171 37517605, 74168000, 0,
172 38272186, 74922581, 0,
173 38507798, 74860928, 0,
174 38683924, 74360520, 0,
175 38683924, 74930000, 0,
176 37920395, 74930000, 0,
177 37338000, 74347605, 0,
178 37158395, 74527209, 0,
179 37158395, 74168000, 0,
180 36403814, 73413419, 0,
181 36168202, 73475072, 0,
182 35992076, 73975480, 0,
183 36020854, 74505198, 0,
184 36168202, 74860928, 0,
185 36403814, 74922581, 0,
186 37158395, 74168000, 0,
187 37158395, 74527209, 0,
188 36755604, 74930000, 0,
189 36068000, 74930000, 0,
190 35776395, 74988004, 0,
191 35529185, 75153185, 0,
192 35364004, 75400395, 0,
193 35306000, 75692000, 0,
194 35364004, 75983605, 0,
195 35529185, 76230815, 0,
196 35776395, 76395996, 0,
197 36068000, 76454000, 0,
198 43688000, 76454000, 0,
199 43979605, 76395996, 0,
200 44226815, 76230815, 0,
201 44391996, 75983605, 0,
202 44450000, 75692000, 0,
203 44450000, 88265000, 0,
204 27305000, 88265000, 0,
205 27305000, 67691000, 0,
206 62611000, 67691000, 0,
207 62611000, 88265000, 2,
208};
209
210// polyset polygons count 2
211int polys_data_holes[]=
212{
213// polygon 0
214 38118035, 75307245, 0,
215 38477245, 74948035, 0,
216 37607408, 74078197, 0,
217 37248197, 74437408, 1,
218
219// polygon 1
220 36198755, 74948035, 0,
221 36557965, 75307245, 0,
222 37427803, 74437408, 0,
223 37068592, 74078197, 2,
224};
225
226void CopyPolygons( KI_POLYGON_SET& aKiPolyList, int polyset[] )
227{
228 std::vector<KI_POLY_POINT> cornerslist;
229
230 KI_POLYGON poly;
231 for( int ii = 0; ; ii++ )
232 {
233 int jj = ii * 3;
234 cornerslist.push_back( KI_POLY_POINT( polyset[jj], polyset[jj+1] ) );
235
236 int flg = polyset[jj+2];
237 if( flg ) // end of the current polygon
238 {
239 bpl::set_points( poly, cornerslist.begin(), cornerslist.end() );
240 aKiPolyList.push_back( poly );
241 cornerslist.clear();
242 }
243 if( flg > 1) // end of list
244 break;
245 }
246
247}
248
249// Debug function: dump a KI_POLYGON_SET to stdout
250// in a C style form
251// each corner is output under <xcoord>, <ycoord, <flg>
252// flg = 0 for all corner but the last of the current poly.
253// flg = 1 for the last of the current poly.
254// flg = 2 for the very last corner.
255void dumpPolySet( const KI_POLYGON_SET& polyset, const char * polyname )
256{
257 printf("// polyset polygons count %d\n", polyset.size());
258 printf("int polyset_%s[]=\n{\n", polyname);
259 int count = 0;
260 for( unsigned kk = 0; kk < polyset.size(); kk++ )
261 {
262 const KI_POLYGON& poly = polyset[kk];
263 if( polyset.size() > 1 )
264 printf("// polygon %d\n", kk);
265 for( unsigned ij = 0; ij < poly.size(); ij++ )
266 {
267 int flg = 0;
268 if( ij == poly.size() -1 )
269 {
270 flg = 1;
271 if( kk == polyset.size() -1 )
272 flg = 2;
273 }
274 printf( " %d, %d, %d,\n", (poly.begin() + ij)->x(),
275 (poly.begin() + ij)->y(), flg );
276 count++;
277 }
278 printf("\n");
279 }
280 printf("}; // %d points\n", count);
281}
282
283
284int main()
285{
286 KI_POLYGON_SET polys_main;
287 // Here, use polys_data_main_bad_results or polys_data_main_crash
288 CopyPolygons( polys_main, polys_data_main_crash );
289
290 KI_POLYGON_SET polys_holes;
291 CopyPolygons( polys_holes, polys_data_holes );
292
293 // When this line is not commented, susbtract works file
294 // becuse the shape of polys_holes is slightly modified
295 // KI_POLYGON_SET dummy; polys_holes += dummy;
296
297 polys_main -= polys_holes;
298
299 // Print result
300 dumpPolySet( polys_main, "result" );
301
302 return 0;
303}