1 | # define _ITERATOR_DEBUG_LEVEL 0
|
---|
2 |
|
---|
3 | #include <boost/polygon/polygon.hpp>
|
---|
4 |
|
---|
5 | template <typename PointType>
|
---|
6 | void 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 |
|
---|
23 | template <typename CT, typename itrT1, typename itrT2>
|
---|
24 | void 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 |
|
---|
54 | int 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 | }
|
---|