예제 #1
0
 static void convolve_two_polygon_sets(polygon_set& result, const polygon_set& a, const polygon_set& b) {
   result.clear();
   std::vector<polygon> a_polygons;
   std::vector<polygon> b_polygons;
   a.get(a_polygons);
   b.get(b_polygons);
   for(std::size_t ai = 0; ai < a_polygons.size(); ++ai) {
     convolve_point_sequence_with_polygons(result, begin_points(a_polygons[ai]),
                                           end_points(a_polygons[ai]), b_polygons);
     for(typename polygon_with_holes_traits<polygon>::iterator_holes_type itrh = begin_holes(a_polygons[ai]);
         itrh != end_holes(a_polygons[ai]); ++itrh) {
       convolve_point_sequence_with_polygons(result, begin_points(*itrh),
                                             end_points(*itrh), b_polygons);
     }
     for(std::size_t bi = 0; bi < b_polygons.size(); ++bi) {
       polygon tmp_poly = a_polygons[ai];
       result.insert(convolve(tmp_poly, *(begin_points(b_polygons[bi]))));
       tmp_poly = b_polygons[bi];
       result.insert(convolve(tmp_poly, *(begin_points(a_polygons[ai]))));
     }
   }
 }
예제 #2
0
 static void convolve_two_point_sequences(polygon_set& result, itrT1 ab, itrT1 ae, itrT2 bb, itrT2 be) {
   if(ab == ae || bb == be)
     return;
   point first_a = *ab;
   point prev_a = *ab;
   std::vector<point> vec;
   polygon poly;
   ++ab;
   for( ; ab != ae; ++ab) {
     point first_b = *bb;
     point prev_b = *bb;
     itrT2 tmpb = bb;
     ++tmpb;
     for( ; tmpb != be; ++tmpb) {
       convolve_two_segments(vec, std::make_pair(prev_b, *tmpb), std::make_pair(prev_a, *ab));
       set_points(poly, vec.begin(), vec.end());
       result.insert(poly);
       prev_b = *tmpb;
     }
     prev_a = *ab;
   }
 }