void ForceValidityVisitor::visit( Solid& g ) { g.forceValidityFlag( valid_ ); for ( size_t i = 0; i < g.numShells(); i++ ) { visit( g.shellN( i ) ); } }
void triangulatePolygon3D( const Solid& g, TriangulatedSurface& triangulatedSurface ) { for ( size_t i = 0; i < g.numShells(); i++ ) { triangulatePolygon3D( g.shellN( i ), triangulatedSurface ); } }
double distanceSolidSolid3D( const Solid& gA, const Solid& gB ) { //SFCGAL_DEBUG( boost::format("dispatch distancePolygonGeometry3D(%s,%s)") % gA.asText() % gB.asText() ); if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } if ( intersects( gA, gB, NoValidityCheck() ) ) { return 0.0 ; } double dMin = std::numeric_limits< double >::infinity() ; for ( size_t i = 0; i < gA.numShells(); i++ ) { for ( size_t j = 0; j < gB.numShells(); j++ ) { dMin = std::min( dMin, gA.shellN( i ).distance3D( gB.shellN( j ) ) ); } } return dMin ; }
double distanceTriangleSolid3D( const Triangle& gA, const Solid& gB ) { if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } if ( intersects3D( gA, gB, NoValidityCheck() ) ) { return 0.0 ; } double dMin = std::numeric_limits< double >::infinity() ; for ( size_t i = 0; i < gB.numShells(); i++ ) { dMin = std::min( dMin, gB.shellN( i ).distance3D( gA ) ); } return dMin ; }
double distancePointSolid3D( const Point& gA, const Solid& gB ) { if ( gA.isEmpty() || gB.isEmpty() ) { return std::numeric_limits< double >::infinity() ; } if ( intersects3D( gA, gB, NoValidityCheck() ) ) { return 0.0 ; } double dMin = std::numeric_limits< double >::infinity() ; for ( size_t i = 0; i < gB.numShells(); i++ ) { dMin = std::min( dMin, distanceGeometryCollectionToGeometry3D( gB.shellN( i ), gA ) ); } return dMin ; }
const Kernel::FT volume( const Solid& solid, NoValidityCheck ) { Kernel::FT vol = 0; const CGAL::Point_3<Kernel> origin( 0,0,0 ); const size_t numShells = solid.numShells(); for ( size_t i=0; i<numShells; i++ ) { std::auto_ptr<Geometry> t( tesselate( solid.shellN( i ), NoValidityCheck() ) ); const TriangulatedSurface& tin = t->as<TriangulatedSurface>(); const size_t numTriangles = tin.numTriangles(); for ( size_t j=0; j<numTriangles; j++ ) { const Triangle& tri = tin.triangleN( j ); vol = vol + CGAL::volume( origin, tri.vertex( 0 ).toPoint_3(), tri.vertex( 1 ).toPoint_3(), tri.vertex( 2 ).toPoint_3() ); } } return vol; }
void GetPointsVisitor::visit( const Solid& g ) { for ( size_t i = 0; i < g.numShells(); i++ ) { visit( g.shellN( i ) ); } }