Ticket #11415: Main.cpp

File Main.cpp, 2.8 KB (added by mhilferink@…, 7 years ago)

main.cpp demonstrating issue 11415

Line 
1# define _ITERATOR_DEBUG_LEVEL 0
2
3#include <boost/polygon/polygon.hpp>
4
5template <typename PointType>
6void convolve_two_segments(
7 std::vector<PointType>& figure,
8 const std::pair<PointType, PointType >& a,
9 const std::pair<PointType, PointType >& b)
10{
11 using namespace boost::polygon;
12 figure.clear();
13 figure.push_back(PointType(a.first));
14 figure.push_back(PointType(a.first));
15 figure.push_back(PointType(a.second));
16 figure.push_back(PointType(a.second));
17 convolve(figure[0], b.second);
18 convolve(figure[1], b.first);
19 convolve(figure[2], b.first);
20 convolve(figure[3], b.second);
21}
22
23template <typename CT, typename itrT1, typename itrT2>
24void convolve_two_point_sequences(boost::polygon::polygon_set_data<CT>& result, itrT1 ab, itrT1 ae, itrT2 bb, itrT2 be)
25{
26 using namespace boost::polygon;
27 typedef point_data<CT> point;
28 typedef boost::polygon::polygon_with_holes_data<CT> polygon;
29
30 if (ab == ae || bb == be)
31 return;
32
33 std::iterator_traits<itrT1>::value_type prev_a = *ab++;
34 std::vector<point> vec;
35 polygon poly;
36
37 for (; ab != ae; ++ab)
38 {
39 itrT2 tmpb = bb;
40 std::iterator_traits<itrT2>::value_type prev_b = *tmpb++;
41
42 for (; tmpb != be; ++tmpb)
43 {
44 convolve_two_segments(vec, std::make_pair(prev_b, *tmpb), std::make_pair(prev_a, *ab));
45 set_points(poly, vec.begin(), vec.end());
46 result.insert(poly, false);
47 prev_b = *tmpb;
48 }
49 prev_a = *ab;
50 }
51}
52
53
54int main(int argc, char** argv)
55{
56 typedef boost::polygon::point_data<int> point_type;
57 typedef boost::polygon::polygon_with_holes_data<int> poly_type;
58 point_type polyPoints[] =
59 {
60 { 102785843, 443558000 },
61 { 102621648, 443753218 },
62 { 102681929, 443603250 },
63 { 102707796, 443579187 },
64 { 102719109, 443590500 },
65 { 102770015, 443542187 },
66 { 102785843, 443558000 },
67 },
68 kernelPoints[] = {
69 { 0, 10000 },
70 { 7071, 7071 },
71 { 10000, 0 },
72 { 7071, -7071 },
73 { 0, -10000 },
74 { -7071, -7071 },
75 { -10000, 0 },
76 { -7071, 7071 },
77 { 0, 10000 },
78 };
79/* !!!!!! With the following 3 lines enabled, the program produces "geometry seems ok". Without, it produces "geometry disappeared"
80 point_type basePoint = polyPoints[0];
81 for (auto& p : polyPoints)
82 boost::polygon::deconvolve(p, basePoint);
83//*/
84
85 poly_type poly, kernel;
86 set_points(poly, polyPoints, polyPoints + 7);
87 set_points(kernel, kernelPoints, kernelPoints + 9);
88
89 boost::polygon::polygon_set_data<int> geometry;
90 geometry.insert(poly);
91
92 convolve_two_point_sequences(geometry, begin_points(kernel), end_points(kernel), begin_points(poly), end_points(poly));
93 convolve(kernel, *begin_points(poly));
94 geometry.insert(kernel);
95
96 std::vector< poly_type > results;
97 geometry.get(results);
98 if (results.empty())
99 std::cerr << "geometry disappeared";
100 else
101 std::cout << "geometry seems ok";
102 return 0;
103}