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 ); } } }
double distanceLineStringLineString3D( const LineString& gA, const LineString& gB ) { if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } size_t nsA = gA.numSegments() ; size_t nsB = gB.numSegments() ; double dMin = std::numeric_limits< double >::infinity() ; for ( size_t i = 0; i < nsA; i++ ) { for ( size_t j = 0; j < nsB; j++ ) { dMin = std::min( dMin, distanceSegmentSegment3D( gA.pointN( i ), gA.pointN( i+1 ), gB.pointN( j ), gB.pointN( j+1 ) ) ) ; } } return dMin ; }
double distancePointLineString3D( const Point& gA, const LineString& gB ) { if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } double dMin = std::numeric_limits< double >::infinity() ; for ( size_t i = 0; i < gB.numSegments(); i++ ) { dMin = std::min( dMin, distancePointSegment3D( gA, gB.pointN( i ), gB.pointN( i+1 ) ) ); } return dMin ; }
/** * @brief build LineString offset */ void offset( const LineString & lineString, const double& radius, Offset_polygon_set_2 & polygonSet ){ for ( size_t i = 0; i < lineString.numSegments(); i++ ){ Polygon_2 P ; P.push_back( lineString.pointN(i).toPoint_2() ); P.push_back( lineString.pointN(i+1).toPoint_2() ); Offset_polygon_with_holes_2 offset = CGAL::approximated_offset_2( P, radius, SFCGAL_OFFSET_ACCURACY ) ; if ( polygonSet.is_empty() ){ polygonSet.insert( offset ); }else{ polygonSet.join( offset ); } } }
bool isCounterClockWiseOriented( const LineString& ls ) { // Compute the 'z' part of the Newell's formula // and test against 0 Kernel::FT z = 0 ; for ( size_t i = 0; i < ls.numSegments(); ++i ) { const Point& pi = ls.pointN( i ); const Point& pj = ls.pointN( i+1 ); z += ( pi.x() - pj.x() ) * ( pi.y() + pj.y() ); } return z > 0; }
LineString::LineString( const LineString& other ): Geometry() { for ( size_t i = 0; i < other.numPoints(); i++ ) { _points.push_back( other.pointN( i ).clone() ) ; } }
void ForceValidityVisitor::visit( LineString& g ) { g.forceValidityFlag( valid_ ); for ( size_t i = 0; i < g.numPoints(); i++ ) { visit( g.pointN( i ) ); } }
double distanceLineStringTriangle3D( const LineString& gA, const Triangle& gB ) { if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } double dMin = std::numeric_limits< double >::infinity() ; const Point& tA = gB.vertex( 0 ) ; const Point& tB = gB.vertex( 1 ) ; const Point& tC = gB.vertex( 2 ) ; for ( size_t i = 0; i < gA.numSegments(); i++ ) { dMin = std::min( dMin, distanceSegmentTriangle3D( gA.pointN( i ), gA.pointN( i+1 ), tA, tB, tC ) ); } return dMin ; }
void WktWriter::writeInner( const LineString & g ) { _s << "("; for ( size_t i = 0; i < g.numPoints(); i++ ){ if ( i != 0 ) _s << ","; write( g.pointN(i).coordinates() ); } _s << ")"; }
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 ); } } }
void GetPointsVisitor::visit( const LineString& g ) { for ( size_t i = 0; i < g.numPoints(); i++ ) { visit( g.pointN( i ) ); } }
void AffineTransform3::transform( LineString& ls ) { for ( size_t i = 0; i < ls.numPoints(); ++i ) { transform( ls.pointN( i ) ); } }