From 76e4197729c40687eb20a3db98da7d546d71283b Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 11 Apr 2025 11:27:38 +0200 Subject: [PATCH] EgtGeomKernel: - correzione errori nel taglio con piani di Surf di bezier. --- SurfBezier.cpp | 40 ++++++++++++++++++++-------------------- Tree.cpp | 12 +++++++++--- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 664f1fb..0898d1e 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1621,7 +1621,7 @@ SurfBezier::GetAuxSurf( void) const if ( m_pSTM != nullptr) return m_pSTM ; // eseguo calcolo - m_pSTM = GetApproxSurf( 50 * EPS_SMALL, 100 * EPS_SMALL) ; + m_pSTM = GetApproxSurf( 1000 * EPS_SMALL, 100 * EPS_SMALL) ; return m_pSTM ; } @@ -1673,7 +1673,7 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin) const m_bClosedU = m_bClosedU || Tree.IsClosedU() ; m_bClosedV = m_bClosedV || Tree.IsClosedV() ; //// salvo i bordi in 3d, che servono in caso si voglia trimmare la superficie DOPO aver costruito la trimesh ausiliaria - // UpdateEdgesFromTree( Tree) ; + // UpdateEdgesFromTree( Tree) ; // ora viene fatto nella GetPolygons } //// per usare i polygon basic////////////////////// @@ -2553,10 +2553,10 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) ICRVCOMPOPOVECTOR vpCCOpen ; ICRVCOMPOPOVECTOR vpCCClosed ; - ////debug - //static int a = 0 ; - //a += 1 ; - ////debug + // //debug + // static int a = 0 ; + // a += 1 ; + // //debug while ( chainC.GetChainFromNear( ptNear, false, vId)) { // creo una curva composita @@ -2607,17 +2607,17 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) vpCCClosed.back()->FromPolyLine( vPLTria[i]) ; } - ////debug - //// ora posso chiamare la costruzione dello spazio parametrico trimmato - //if ( a == 4) { - // vector vObj ; - // for ( int i = 0 ; i < int(vpCCOpen.size()) ; ++i) - // vObj.push_back( vpCCOpen[i]->Clone()) ; - // vObj.push_back( m_pTrimReg->Clone()) ; - // vObj.push_back( this->Clone()) ; - // SaveGeoObj( vObj, "D:\\Temp\\bezier\\triangolazione\\doppiaSTM\\curveOPEN.nge", 2) ; - //} - ////debug + // //debug + // // ora posso chiamare la costruzione dello spazio parametrico trimmato + // if ( a == 2) { + // vector vObj ; + // for ( int i = 0 ; i < int(vpCCOpen.size()) ; ++i) + // vObj.push_back( vpCCOpen[i]->Clone()) ; + // vObj.push_back( m_pTrimReg->Clone()) ; + // vObj.push_back( this->Clone()) ; + // SaveGeoObj( vObj, "D:\\Temp\\bezier\\triangolazione\\doppiaSTM\\curveOPEN.nge", 2) ; + // } + // //debug PtrOwner pSFR( CreateTrimRegionFromCuts( vpCCOpen, vpCCClosed)) ; if ( IsNull( pSFR) || ! pSFR->IsValid()) @@ -2748,6 +2748,8 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in if ( ! m_mCCEdge[c][i]->GetOnlyPoint(pt)) return false ; vInters[c] = AreSamePointApprox( pt, ptI) ? 1 : 0 ; + if ( vInters[c] == 1) + bIsPole = true ; nInters += vInters[c] ; } else { @@ -2759,9 +2761,7 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in // se ho tre intersezioni vuol dire che un lato è collassato in un punto e il punto di cui voglio la controimmagine è esattamente nel polo // oppure sono su un lato di chiusura - if ( nInters == 3 || ( m_bClosedU && ( vInters[1] == 1 || vInters[3] == 1)) || ( m_bClosedV && ( vInters[0] == 1 || vInters[2] == 1))) { - if ( nInters == 3) - bIsPole = true ; + if ( bIsPole || ( m_bClosedU && ( vInters[1] == 1 || vInters[3] == 1)) || ( m_bClosedV && ( vInters[0] == 1 || vInters[2] == 1))) { // visto che sono in un polo o su un lato di chiusura devo verificare di aver ricevuto il triangolo giusto // se è stato passato il punto successivo o precedente mi sposto verso quello e ricalcolo il triangolo di appartenenza if ( ! ptIPrevOrNext.IsValid()) diff --git a/Tree.cpp b/Tree.cpp index 364c0ba..a5a4c05 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -2096,10 +2096,16 @@ Tree::UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) if ( ! pCC->GetEndPoint( ptLast)) { // potrei avere una compo vuota o con solo un punto // se non riesco ad aggiungere una linea allora era una compo vuota - if ( ! pCC->AddLine( pt)) - pCC->AddPoint( pt) ; + if ( ! pCC->GetOnlyPoint( ptLast)) { + pCC->FromPoint( pt) ; + ptLast = pt ; + } + else { + pCC->Clear() ; + pCC->AddPoint( ptLast) ; + pCC->AddLine( pt) ; + } bAdded = true ; - pCC->GetStartPoint( ptLast) ; } if( pCC->IsValid()) { if ( ! bAdded)