From 2d94dddccb442c60617578cb09c17b9cdebbc9d0 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 10 Apr 2026 10:25:04 +0200 Subject: [PATCH 1/3] EgtGeomKernel : - correzioni alla RuledByIsoParamSet. --- SurfBezier.cpp | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 70ebca4..70a730c 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -6520,12 +6520,12 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c bool bSplitToAdd = true ; int c0 = 0, c1 = 0 ; while ( bSplitToAdd) { - if ( c0 > ssize( vdParamPos0) - 1 && c1 > ssize( vdParamPos1) - 1) { + if ( c0 > ssize( vdParamPos0) - 1 || c1 > ssize( vdParamPos1) - 1) { LOG_DBG_ERR( GetEGkLogger(), "Surf Bez Ruled Guided: error while reparametrizing some section") ; return false ; } // se ho una corrispondenza tra punti ( e non sono alla fine del tratto) allora non aggiungo split - if ( abs( vdParamPos0[c0] - vdParamPos1[c1]) < EPS_SMALL && vdParamPos0[c0] < 1) { + if ( abs( vdParamPos0[c0] - vdParamPos1[c1]) < EPS_PARAM && vdParamPos0[c0] < 1) { ++c0 ; ++c1 ; ++nLastParam0 ; @@ -6535,14 +6535,17 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c // se non ho corrispondenza allora aggiungo uno split sulla curva a cui manca il punto corrispondente else if ( vdParamPos0[c0] < vdParamPos1[c1]) { double dPar ; CrvU1.GetParamAtLength( dLenPrev1 + dLen1 * vdParamPos0[c0], dPar) ; - if ( abs( dPar - round( dPar)) > EPS_SMALL) { - vdSplit1.push_back( dPar) ; - nSplit1 = vdSplit1.size() ; - } - else if ( dPar = round( dPar) ; dPar > nLastParam1){ - ++ c1 ; - ++ nLastParam1 ; + if ( dPar > dLastParam1 + EPS_PARAM) { + if ( abs( dPar - round( dPar)) > EPS_PARAM) { + vdSplit1.push_back( dPar) ; + nSplit1 = vdSplit1.size() ; + } + else if ( dPar = round( dPar) ; dPar > nLastParam1){ + ++ c1 ; + ++ nLastParam1 ; + } } + dLastParam1 = dPar ; ++nLastParam0 ; vPairs.emplace_back( nLastParam0 + nSplit0, nLastParam1 + nSplit1) ; ++c0 ; @@ -6550,14 +6553,17 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c else if ( vdParamPos0[c0] > vdParamPos1[c1]) { double dPar ; CrvU0.GetParamAtLength( dLenPrev0 + dLen0 * vdParamPos1[c1], dPar) ; // se lo split non è in prossimità di una joint già esistente allora lo aggiungo - if ( abs( dPar - round( dPar)) > EPS_SMALL) { - vdSplit0.push_back( dPar) ; - nSplit0 = vdSplit0.size() ; - } - else if ( dPar = round( dPar) ; dPar > nLastParam0){ - ++ c0 ; - ++ nLastParam0 ; + if ( dPar > dLastParam0 + EPS_PARAM) { + if ( abs( dPar - round( dPar)) > EPS_PARAM) { + vdSplit0.push_back( dPar) ; + nSplit0 = vdSplit0.size() ; + } + else if ( dPar = round( dPar) ; dPar > nLastParam0){ + ++ c0 ; + ++ nLastParam0 ; + } } + dLastParam0 = dPar ; ++nLastParam1 ; vPairs.emplace_back( nLastParam0 + nSplit0, nLastParam1 + nSplit1) ; ++c1 ; From d0f2d56bdb1c193bfdc13cf0dcfbc3ecf5a5b08f Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 10 Apr 2026 12:35:07 +0200 Subject: [PATCH 2/3] EgtGeomKernel : - correzione per split vicini a joint in RuledByIsoParamSet. --- SurfBezier.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 70a730c..fcea843 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -6525,18 +6525,32 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c return false ; } // se ho una corrispondenza tra punti ( e non sono alla fine del tratto) allora non aggiungo split - if ( abs( vdParamPos0[c0] - vdParamPos1[c1]) < EPS_PARAM && vdParamPos0[c0] < 1) { - ++c0 ; - ++c1 ; - ++nLastParam0 ; - ++nLastParam1 ; - vPairs.emplace_back( nLastParam0 + nSplit0, nLastParam1 + nSplit1) ; + if ( abs( vdParamPos0[c0] - vdParamPos1[c1]) < EPS_SMALL && (vdParamPos0[c0] < 1 || vdParamPos1[c1] < 1)) { + if ( (vdParamPos0[c0] < 1 - EPS_SMALL || vdParamPos1[c1] < 1 - EPS_SMALL)) { + ++c0 ; + ++c1 ; + ++nLastParam0 ; + ++nLastParam1 ; + vPairs.emplace_back( nLastParam0 + nSplit0, nLastParam1 + nSplit1) ; + } + else { + if ( vdParamPos0[c0] > 1 - EPS_SMALL && c0 < ssize( vdParamPos0) - 1) { + bIntParam0 = true ; + dParam0 = round( dParam0) ; + } + if ( vdParamPos1[c1] > 1 - EPS_SMALL && c1 < ssize( vdParamPos1) - 1) { + bIntParam1 = true ; + dParam1 = round( dParam1) ; + } + c0 = ssize( vdParamPos0) - 1 ; + c1 = ssize( vdParamPos1) - 1 ; + } } // se non ho corrispondenza allora aggiungo uno split sulla curva a cui manca il punto corrispondente else if ( vdParamPos0[c0] < vdParamPos1[c1]) { double dPar ; CrvU1.GetParamAtLength( dLenPrev1 + dLen1 * vdParamPos0[c0], dPar) ; if ( dPar > dLastParam1 + EPS_PARAM) { - if ( abs( dPar - round( dPar)) > EPS_PARAM) { + if ( abs( dPar - round( dPar)) > EPS_SMALL) { vdSplit1.push_back( dPar) ; nSplit1 = vdSplit1.size() ; } @@ -6554,7 +6568,7 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c double dPar ; CrvU0.GetParamAtLength( dLenPrev0 + dLen0 * vdParamPos1[c1], dPar) ; // se lo split non è in prossimità di una joint già esistente allora lo aggiungo if ( dPar > dLastParam0 + EPS_PARAM) { - if ( abs( dPar - round( dPar)) > EPS_PARAM) { + if ( abs( dPar - round( dPar)) > EPS_SMALL) { vdSplit0.push_back( dPar) ; nSplit0 = vdSplit0.size() ; } From 17346e1b42a0947af2a421fe050ec3f712b165c4 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 10 Apr 2026 15:22:44 +0200 Subject: [PATCH 3/3] EgtGeomKernel : - correzione alla triangolazione bezier. --- Tree.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Tree.cpp b/Tree.cpp index 2beaa59..f2fa7c6 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -352,10 +352,6 @@ Tree::SetSurf( const SurfBezier* pSrfBz, const Point3d& ptMin, const Point3d& pt } // se ho fatto solo 1 split orizzontale e ho due celle foglie nId = 0 e nId = 1 if ( m_mTree.size() == 3 && ! m_mTree.at(-1).IsSplitVert()) { - m_mTree[0].m_nLeft = -1 ; - m_mTree[0].m_nRight = -1 ; - m_mTree[1].m_nLeft = -1 ; - m_mTree[1].m_nRight = -1 ; m_mTree[0].SetSplitDirVert( true) ; Split( 0) ; m_mTree[1].SetSplitDirVert( true) ;