Exemplo n.º 1
0
std::auto_ptr< Geometry > extrude( const Geometry& g, const Kernel::Vector_3& v )
{
    switch ( g.geometryTypeId() ) {
    case TYPE_POINT:
        return std::auto_ptr< Geometry >( extrude( g.as< Point >(), v ) );

    case TYPE_LINESTRING:
        return std::auto_ptr< Geometry >( extrude( g.as< LineString >(), v ) );

    case TYPE_POLYGON:
        return std::auto_ptr< Geometry >( extrude( g.as< Polygon >(), v ) );

    case TYPE_TRIANGLE:
        return std::auto_ptr< Geometry >( extrude( g.as< Triangle >(), v ) );

    case TYPE_GEOMETRYCOLLECTION:
        return std::auto_ptr< Geometry >( extrude( g.as< GeometryCollection >(), v ) );

    case TYPE_MULTIPOINT:
        return std::auto_ptr< Geometry >( extrude( g.as< MultiPoint >(), v ) );

    case TYPE_MULTILINESTRING:
        return std::auto_ptr< Geometry >( extrude( g.as< MultiLineString >(), v ) );

    case TYPE_MULTIPOLYGON:
        return std::auto_ptr< Geometry >( extrude( g.as< MultiPolygon >(), v ) );

    case TYPE_TRIANGULATEDSURFACE:
        return std::auto_ptr< Geometry >( extrude( g.as< TriangulatedSurface >(), v ) );

    case TYPE_POLYHEDRALSURFACE:
        return std::auto_ptr< Geometry >( extrude( g.as< PolyhedralSurface >(), v ) );

    case TYPE_SOLID:
    case TYPE_MULTISOLID:
        //extrusion not available
        break;
    }

    BOOST_THROW_EXCEPTION( InappropriateGeometryException(
                               ( boost::format( "unexpected GeometryType in extrude ('%1%')" ) % g.geometryType() ).str()
                           ) );
}
Exemplo n.º 2
0
void triangulatePolygon3D(
    const Geometry& g,
    TriangulatedSurface& triangulatedSurface
)
{
    if ( g.isEmpty() ) {
        return;
    }

    SFCGAL_ASSERT_GEOMETRY_VALIDITY( g );

    switch ( g.geometryTypeId() ) {
    case TYPE_TRIANGLE:
        return triangulatePolygon3D( g.as< Triangle >(), triangulatedSurface );
    case TYPE_POLYGON:
        return triangulatePolygon3D( g.as< Polygon >(), triangulatedSurface );
    case TYPE_TRIANGULATEDSURFACE:
        return triangulatePolygon3D( g.as< TriangulatedSurface >(), triangulatedSurface );
    case TYPE_POLYHEDRALSURFACE:
        return triangulatePolygon3D( g.as< PolyhedralSurface >(), triangulatedSurface );
    case TYPE_SOLID:
        return triangulatePolygon3D( g.as< Solid >(), triangulatedSurface );
    case TYPE_MULTIPOLYGON:
    case TYPE_MULTISOLID:
    case TYPE_GEOMETRYCOLLECTION: {
        for ( size_t i = 0; i < g.numGeometries(); i++ ) {
            triangulatePolygon3D( g.geometryN( i ), triangulatedSurface ) ;
        }

        return ;
    }
    default:
        BOOST_THROW_EXCEPTION(
            InappropriateGeometryException(
                ( boost::format( "can't triangulate 3d polygons for type '%1%'" ) % g.geometryType() ).str()
            )
        );
    }
}