EgtGeomKernel 2.2j1 :
- operazione booleane su TriMesh eseguite con scalatura di 1024.
This commit is contained in:
+30
-6
@@ -104,7 +104,8 @@ Polygon3d::FromPolyLine( const PolyLine& PL)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Polygon3d::FromPlaneTrimmedWithBox( const Plane3d& plPlane, const Point3d& ptMin, const Point3d& ptMax, bool bOnEq, bool bOnCt)
|
||||
Polygon3d::FromPlaneTrimmedWithBox( const Plane3d& plPlane,
|
||||
const Point3d& ptMin, const Point3d& ptMax, bool bOnEq, bool bOnCt, double dToler)
|
||||
{
|
||||
// pulisco tutto
|
||||
Clear() ;
|
||||
@@ -112,17 +113,32 @@ Polygon3d::FromPlaneTrimmedWithBox( const Plane3d& plPlane, const Point3d& ptMin
|
||||
if ( plPlane.GetVersN().IsSmall() || AreSamePointApprox( ptMin, ptMax))
|
||||
return false ;
|
||||
// assegno il piano
|
||||
m_Plane = plPlane ;
|
||||
Plane3d plTemp = plPlane ;
|
||||
// se piano molto vicino ad uno dei vertici del box, lo faccio passare esattamente per il vertice
|
||||
if ( dToler > EPS_SMALL) {
|
||||
PNTVECTOR vBoxVert = { Point3d( ptMin.x, ptMin.y, ptMin.z), Point3d( ptMin.x, ptMin.y, ptMax.z),
|
||||
Point3d( ptMax.x, ptMin.y, ptMin.z), Point3d( ptMax.x, ptMin.y, ptMax.z),
|
||||
Point3d( ptMin.x, ptMax.y, ptMin.z), Point3d( ptMin.x, ptMax.y, ptMax.z),
|
||||
Point3d( ptMax.x, ptMax.y, ptMin.z), Point3d( ptMax.x, ptMax.y, ptMax.z)} ;
|
||||
for ( const auto& ptP : vBoxVert) {
|
||||
if ( abs( DistPointPlane( ptP, plTemp)) < dToler) {
|
||||
Point3d ptNear = ProjectPointOnPlane( ptP, plTemp) ;
|
||||
Vector3d vtDelta = ptP - ptNear ;
|
||||
plTemp.Offset( vtDelta * plTemp.GetVersN()) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// centro del box proiettato nel piano
|
||||
Point3d ptCen = Media( ptMin, ptMax, 0.5) ;
|
||||
ptCen -= (( ptCen - ORIG) * plPlane.GetVersN() - plPlane.GetDist()) * plPlane.GetVersN() ;
|
||||
ptCen -= (( ptCen - ORIG) * plTemp.GetVersN() - plTemp.GetDist()) * plTemp.GetVersN() ;
|
||||
// raggio del box
|
||||
double dDiam = Dist( ptMin, ptMax) ;
|
||||
// poligono nel suo piano
|
||||
FromRectangle( dDiam, dDiam) ;
|
||||
// riferimento del piano
|
||||
Frame3d frRef ;
|
||||
frRef.Set( ptCen, plPlane.GetVersN(), FromUprightOrtho( plPlane.GetVersN())) ;
|
||||
frRef.Set( ptCen, plTemp.GetVersN(), FromUprightOrtho( plTemp.GetVersN())) ;
|
||||
ToGlob( frRef) ;
|
||||
// lo trimmo con le facce del box
|
||||
Plane3d plFace ;
|
||||
@@ -138,14 +154,22 @@ Polygon3d::FromPlaneTrimmedWithBox( const Plane3d& plPlane, const Point3d& ptMin
|
||||
Trim( plFace, true, bOnEq, bOnCt) ;
|
||||
plFace.Set( ptMax.x, X_AX) ; // faccia 6 (Norm = X+)
|
||||
Trim( plFace, true, bOnEq, bOnCt) ;
|
||||
|
||||
// elimino eventuali vertici coincidenti
|
||||
for ( int i = 1 ; i < int( m_vVert.size()) ;) {
|
||||
if ( SqDist( m_vVert[i], m_vVert[i-1]) < SQ_EPS_SMALL) {
|
||||
m_vVert[i-1] = Media( m_vVert[i-1], m_vVert[i]) ;
|
||||
m_vVert.erase( m_vVert.begin() + i) ;
|
||||
}
|
||||
else
|
||||
++ i ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Polygon3d::FromPlaneTrimmedWithBox( const Point3d& ptOn, const Vector3d& vtN,
|
||||
const Point3d& ptMin, const Point3d& ptMax, bool bOnEq, bool bOnCt)
|
||||
const Point3d& ptMin, const Point3d& ptMax, bool bOnEq, bool bOnCt, double dToler)
|
||||
{
|
||||
Plane3d plPlane ;
|
||||
plPlane.Set( ptOn, vtN) ;
|
||||
|
||||
Reference in New Issue
Block a user