コード例 #1
0
ファイル: minkowskiSum.cpp プロジェクト: hdeeken/SFCGAL
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 );
        }
    }
}
コード例 #2
0
ファイル: distance3d.cpp プロジェクト: Oslandia/SFCGAL
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 ;
}
コード例 #3
0
ファイル: distance3d.cpp プロジェクト: Oslandia/SFCGAL
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 ;
}
コード例 #4
0
ファイル: offset.cpp プロジェクト: amutu/SFCGAL
/**
 * @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 );
		}
	}
}
コード例 #5
0
ファイル: orientation.cpp プロジェクト: Ezio47/SFCGAL
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;
}
コード例 #6
0
ファイル: LineString.cpp プロジェクト: hjanetzek/SFCGAL
LineString::LineString( const LineString& other ):
    Geometry()
{
    for ( size_t i = 0; i < other.numPoints(); i++ ) {
        _points.push_back( other.pointN( i ).clone() ) ;
    }
}
コード例 #7
0
void ForceValidityVisitor::visit( LineString& g )
{
    g.forceValidityFlag( valid_ );
    for ( size_t i = 0; i < g.numPoints(); i++ ) {
        visit( g.pointN( i ) );
    }
}
コード例 #8
0
ファイル: distance3d.cpp プロジェクト: Oslandia/SFCGAL
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 ;
}
コード例 #9
0
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 << ")";
}
コード例 #10
0
ファイル: minkowskiSum.cpp プロジェクト: amutu/SFCGAL
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 );
		}
	}
}
コード例 #11
0
ファイル: GetPointsVisitor.cpp プロジェクト: HEShuang/SFCGAL
void GetPointsVisitor::visit( const LineString& g )
{
    for ( size_t i = 0; i < g.numPoints(); i++ ) {
        visit( g.pointN( i ) );
    }
}
コード例 #12
0
ファイル: AffineTransform3.cpp プロジェクト: Ezio47/SFCGAL
void AffineTransform3::transform( LineString& ls )
{
    for ( size_t i = 0; i < ls.numPoints(); ++i ) {
        transform( ls.pointN( i ) );
    }
}