| 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 | }
|
|---|