void minkowskiSum( const LineString& gA, const Polygon_2& gB, Polygon_set_2& polygonSet ) { if ( gA.isEmpty() ) { return ; } int npt = gA.numPoints() ; for ( int i = 0; i < npt - 1 ; i++ ) { Polygon_2 P; P.push_back( gA.pointN( i ).toPoint_2() ); P.push_back( gA.pointN( i+1 ).toPoint_2() ); // // We want to compute the "minkowski sum" on each segment of the line string // This is not very well defined. But it appears CGAL supports it. // However we must use the explicit "full convolution" method for that particular case in CGAL >= 4.7 #if CGAL_VERSION_NR < 1040701000 // version 4.7 Polygon_with_holes_2 part = minkowski_sum_2( P, gB ); #else Polygon_with_holes_2 part = minkowski_sum_by_full_convolution_2( P, gB ); #endif // merge into a polygon set if ( polygonSet.is_empty() ) { polygonSet.insert( part ); } else { polygonSet.join( part ); } } }
/* * append gA+gB into the polygonSet */ void minkowskiSum( const Point& gA, const Polygon_2& gB, Polygon_set_2& polygonSet ) { BOOST_ASSERT( gB.size() ); CGAL::Aff_transformation_2< Kernel > translate( CGAL::TRANSLATION, gA.toVector_2() ); Polygon_2 sum ; for ( Polygon_2::Vertex_const_iterator it = gB.vertices_begin(); it != gB.vertices_end(); ++it ) { sum.push_back( translate.transform( *it ) ); } if ( sum.is_clockwise_oriented() ) { sum.reverse_orientation() ; } if ( polygonSet.is_empty() ) { polygonSet.insert( sum ); } else { polygonSet.join( sum ); } }
Polygon_set_2 join_polygons_with_holes(Array pwhs){ vector<Polygon_with_holes_2> polygon_vector; for (unsigned int i = 0; i < pwhs.size(); i++) { Polygon_with_holes_2 pwh = from_ruby<Polygon_with_holes_2>(pwhs[i]); polygon_vector.push_back(pwh); } Polygon_set_2 S; S.join(polygon_vector.begin(), polygon_vector.end()); return S; }
Polygon_set_2 join(Array polygons){ vector<Polygon_2> polygon_vector; for (unsigned int i = 0; i < polygons.size(); i++) { Polygon_2 polygon = from_ruby<Polygon_2>(polygons[i]); if (polygon.is_simple()) { polygon_vector.push_back(polygon); } } Polygon_set_2 S; S.join(polygon_vector.begin(), polygon_vector.end()); return S; }
void minkowskiSum( const Polygon& gA, const Polygon_2& gB, Polygon_set_2& polygonSet ) { if ( gA.isEmpty() ) { return ; } /* * Invoke minkowski_sum_2 for exterior ring */ { Polygon_with_holes_2 sum = minkowski_sum_2( gA.exteriorRing().toPolygon_2(), gB ) ; if ( polygonSet.is_empty() ) { polygonSet.insert( sum ); } else { polygonSet.join( sum ); } } /* * Compute the Minkowski sum for each segment of the interior rings * and perform the union of the result. The result is a polygon, and its holes * correspond to the inset. * */ if ( gA.hasInteriorRings() ) { Polygon_set_2 sumInteriorRings ; for ( size_t i = 0; i < gA.numInteriorRings(); i++ ) { minkowskiSum( gA.interiorRingN( i ), gB, sumInteriorRings ) ; } /* * compute the difference for each hole of the resulting polygons */ std::list<Polygon_with_holes_2> interiorPolygons ; sumInteriorRings.polygons_with_holes( std::back_inserter( interiorPolygons ) ) ; for ( std::list<Polygon_with_holes_2>::iterator it_p = interiorPolygons.begin(); it_p != interiorPolygons.end(); ++it_p ) { for ( Polygon_with_holes_2::Hole_iterator it_hole = it_p->holes_begin(); it_hole != it_p->holes_end(); ++it_hole ) { it_hole->reverse_orientation() ; polygonSet.difference( *it_hole ) ; } // foreach hole }// foreach polygon } }
void minkowskiSum( const LineString& gA, const Polygon_2 & gB, Polygon_set_2 & polygonSet ){ if ( gA.isEmpty() ){ return ; } int npt = gA.numPoints() ; for ( int i = 0; i < npt - 1 ; i++ ){ Polygon_2 P; P.push_back( gA.pointN(i).toPoint_2() ); P.push_back( gA.pointN(i+1).toPoint_2() ); Polygon_with_holes_2 part = minkowski_sum_2( P, gB ); // merge into a polygon set if ( polygonSet.is_empty() ){ polygonSet.insert( part ); }else{ polygonSet.join( part ); } } }