EgtGeomKernel 2.2j1 :

- operazione booleane su TriMesh eseguite con scalatura di 1024.
This commit is contained in:
Dario Sassi
2020-10-03 15:49:44 +00:00
parent 7048800e53
commit 74df7ecfcd
3 changed files with 177 additions and 14 deletions
+30 -6
View File
@@ -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) ;