From b51d0c3e6429bb60204666cefa915947f38b6fbf Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 4 Jun 2024 19:07:58 +0200 Subject: [PATCH 1/5] EgtGeomKernel : - miglioramento a GetArc3P (ora riconosciuto come retta anche quando il punto intermedio coincide con uno dei due estremi). --- ArcSpecial.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ArcSpecial.cpp b/ArcSpecial.cpp index b06b486..73b9c8c 100644 --- a/ArcSpecial.cpp +++ b/ArcSpecial.cpp @@ -134,7 +134,8 @@ GetArc3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d& ptEnd, // calcolo arco non riuscito, se i punti sono allineati nel giusto verso per essere una retta // verifico se i punti sono allineati nel giusto verso - if ( ( ptOther - ptStart) * ( ptEnd - ptOther) > EPS_ZERO) { + if ( ( ptOther - ptStart) * ( ptEnd - ptOther) > EPS_ZERO || + AreSamePointApprox( ptOther, ptStart) || AreSamePointApprox( ptEnd, ptOther)) { // creo l'oggetto retta PtrOwner pLine( CreateBasicCurveLine()) ; if ( IsNull( pLine)) From f08dee836bd76191658a6c3fc79826ce5ba3a4cb Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 5 Jun 2024 09:10:22 +0200 Subject: [PATCH 2/5] EgtGeomKernel : - correzioni alla conversione da nurbs a bezier per curve e superfici. --- CurveAux.cpp | 14 ++++++++++---- SurfAux.cpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CurveAux.cpp b/CurveAux.cpp index 90579e7..63cc18f 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -803,14 +803,14 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // se la curva è peridica verifco che effettivamente ci sia un numero di punti ripetituti uguale al grado della curva // wrap della curva su se stessa if ( cnData.bPeriodic ) { - bool bRepetead = true ; + bool bRepeated = true ; for ( int i = 0 ; i < cnData.nDeg ; ++i) { if ( ! AreSamePointApprox( cnData.vCP[i], cnData.vCP.end()[-cnData.nDeg + i]) ) { - bRepetead = false ; + bRepeated = false ; break ; } } - if ( ! bRepetead){ + if ( ! bRepeated || (bRepeated && AreSamePointApprox( cnData.vCP[0],cnData.vCP[cnData.nDeg]))){ // salvo il vettore dei nodi in caso mi accorga di avere tra le mani una curva unclamped DBLVECTOR vU = cnData.vU ; // se il primo e l'ultimo punto non coincidono allora aggiungo il primo punto in fondo al vettore dei punti di controllo @@ -1031,15 +1031,21 @@ NurbsCurveCanonicalize( CNurbsData& cnData) nU = nU - 2 * ( nDeg - 1); PNTVECTOR vCP_clamped ; vCP_clamped.resize( nCP) ; + DBLVECTOR vW_clamped ; + vW_clamped.resize( nCP) ; DBLVECTOR vU_clamped ; vU_clamped.resize( nU) ; for ( int i = 0 ; i < nCP ; ++i) { if ( ! cnData.bRat) vCP_clamped[i] = cnData.vCP[i + nDeg - 1] ; - else + else { + vW_clamped[i] = cnData.vW[i + nDeg - 1] ; vCP_clamped[i] = cnData.vCP[i + nDeg - 1] / cnData.vW[i + nDeg - 1] ; + } } cnData.vCP = vCP_clamped ; + cnData.vW = vW_clamped ; + for ( int i = 0 ; i < nU ; ++i) { vU_clamped[i] = cnData.vU[i + nDeg - 1] ; } diff --git a/SurfAux.cpp b/SurfAux.cpp index 4e9e612..bcdd829 100644 --- a/SurfAux.cpp +++ b/SurfAux.cpp @@ -45,6 +45,7 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) for( int j = 0 ; j < snData.nCPV ; ++j) { CNurbsData nuCurve ; nuCurve.bPeriodic = true ; + nuCurve.bRat = snData.bRat ; nuCurve.nDeg = snData.nDegU ; nuCurve.vU = vU ; // vettore dei punti di controllo @@ -63,13 +64,23 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie + if ( snData.mCP.size() != nuCurve.vCP.size() ) { + snData.mCP.resize( nuCurve.vCP.size()) ; + if( snData.bRat) + snData.mW.resize( nuCurve.vW.size()) ; + } for ( int i = 0 ; i < snData.nCPU ; ++i) { snData.mCP[i][j] = nuCurve.vCP[i] ; + if( snData.bRat) { + snData.mW[i][j] = nuCurve.vW[i] ; + snData.mCP[i][j] *= nuCurve.vW[i] ; + } } snData.vU = nuCurve.vU ; } } snData.bPeriodicU = false ; + snData.nCPU = int( snData.mCP.size()) ; } if ( snData.bPeriodicV || ! snData.bClampedV) { bool bIsRational = snData.bRat ; @@ -83,6 +94,7 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) for( int i = 0 ; i < snData.nCPU ; ++i) { CNurbsData nuCurve ; nuCurve.bPeriodic = true ; + nuCurve.bRat = snData.bRat ; nuCurve.nDeg = snData.nDegV ; nuCurve.vU = vV ; // vettore dei punti di controllo @@ -101,15 +113,28 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie - for ( int j = 0 ; j < snData.nCPV ; ++j ) { + if ( snData.mCP[i].size() != nuCurve.vCP.size()){ + snData.mCP[i].clear() ; + snData.mCP[i].resize( nuCurve.vCP.size()) ; + if ( snData.bRat ) { + snData.mW[i].clear() ; + snData.mW[i].resize( nuCurve.vW.size()) ; + } + } + for ( int j = 0 ; j < int( nuCurve.vCP.size()) ; ++j ) { snData.mCP[i][j] = nuCurve.vCP[j] ; + if ( snData.bRat ) { + snData.mW[i][j] = nuCurve.vW[j] ; + snData.mCP[i][j] *= nuCurve.vW[j] ; + } } snData.vV = nuCurve.vU ; } } snData.bPeriodicV = false ; + snData.nCPV = int( snData.mCP[0].size()) ; } - return true; + return true ; } //---------------------------------------------------------------------------- From f48053a54166d1b09f84ca255383402f48b7897c Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 5 Jun 2024 16:14:39 +0200 Subject: [PATCH 3/5] EgtGeomKernel : - nelle booleane delle trimesh piccola modifica a DecomposeLoop. --- SurfTriMeshBooleans.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 3ad98a6..4a2b497 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -73,8 +73,7 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA bool bChangedStart = ChangeStart( ptOpenLoopStP, cvBoundClosedLoopVec[nLoop]) ; // splitto bool bSplitted = SplitAtPoint( ptOpenLoopEnP, cvBoundClosedLoopVec[nLoop], Loop1, Loop2) ; - if ( ! ( bChangedStart && bSplitted) || - ( nLastOpenLoopPoint == 0 && ( Loop1.size() == 2 || Loop2.size() == 2))) + if ( ! ( bChangedStart && bSplitted)) continue ; // la catena aperta non è interna al loop chiuso attuale // il loop 2 segue sempre la direzione della catena, il loop 1 ha dentro la catena invertita From 84bcc715a896019ebb062be5671ee92883ed2ecd Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 6 Jun 2024 09:12:47 +0200 Subject: [PATCH 4/5] EgtGeomKernel : - piccola correzione di una tolleranza. --- DistPointSurfTm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DistPointSurfTm.cpp b/DistPointSurfTm.cpp index db2df80..e3b049c 100644 --- a/DistPointSurfTm.cpp +++ b/DistPointSurfTm.cpp @@ -152,7 +152,7 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf) double dCurSqDist ; // Se la distanza del triangolo è valida e minore di quella attuale aggiorno if ( distPT.GetSqDist( dCurSqDist)) { - if ( abs( dCurSqDist - dMinSqDist) < EPS_SMALL) // se distanze uguali... + if ( abs( dCurSqDist - dMinSqDist) < SQ_EPS_SMALL) // se distanze uguali... vTria.emplace_back( make_pair( nT, trCurTria)) ; // aggiungo il triangolo else if ( dCurSqDist < dMinSqDist) { // se minore... vTria.clear() ; // pulisco il vettore From a0316e280ccb82ad711b4fad47db596e57ce53be Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 6 Jun 2024 09:20:56 +0200 Subject: [PATCH 5/5] EgtGeomKernel : - piccola correzione. --- SurfBezier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index ad0991d..383c5f2 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -2351,7 +2351,7 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in return false ; if ( bThroughEdge != nullptr) *bThroughEdge = true ; - Point3d ptI2 = ptI + ( ptIPrevOrNext - ptI) * EPS_SMALL ; + Point3d ptI2 = ptI + ( ptIPrevOrNext - ptI) * 3 * EPS_SMALL ; // ricalcolo il triangolo di appartenenza DistPointSurfTm dPtStm( ptI2, *pSurfTm) ; dPtStm.GetMinDistTriaIndex( nTriaIndex) ;