From a01346577fe015a0ba9c13f8afafb65592b2f381 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 24 Nov 2025 13:07:43 +0100 Subject: [PATCH] EgtGeomKernel : - correzioni alle bezier. --- SurfBezier.cpp | 2 -- Tree.cpp | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 0df6b37..5e80d18 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1880,8 +1880,6 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin, bool bUpdateEdges) cons // aggiorno la chiusura della superficie 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) ; // ora viene fatto nella GetPolygons } //// per usare i polygon basic////////////////////// diff --git a/Tree.cpp b/Tree.cpp index fc0632b..b4a318a 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -455,11 +455,46 @@ Tree::Split( int nId, double dSplitValue) { Cell& cToSplit = m_mTree.at(nId) ; // controllo che lo split non venga fatto sul lato della cella - if ( ( cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().x + 10 * EPS_SMALL && - dSplitValue < cToSplit.GetTopRight().x - 10 * EPS_SMALL) || - ( ! cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().y + 10 * EPS_SMALL && - dSplitValue < cToSplit.GetTopRight().y - 10 * EPS_SMALL)) { - // quando si implementerà lo split a parametro libero bisognerà impedire che si facciano split troppo vicini al bordo della cella!!!!!!!!!!!!!!!!!!! + bool bGoodSplitVert = cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().x + 10 * EPS_SMALL && + dSplitValue < cToSplit.GetTopRight().x - 10 * EPS_SMALL ; + bool bGoodSplitHoriz = ! cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().y + 10 * EPS_SMALL && + dSplitValue < cToSplit.GetTopRight().y - 10 * EPS_SMALL ; + Point3d ptP00, ptP01, ptP10, ptP11 ; + + if( bGoodSplitVert) { + if( cToSplit.GetBottomRight().x - dSplitValue > dSplitValue - cToSplit.GetBottomLeft().x) { + GetPoint( cToSplit.GetBottomLeft().x, cToSplit.GetBottomLeft().y, ptP00) ; + GetPoint( dSplitValue, cToSplit.GetBottomRight().y, ptP10) ; + GetPoint( cToSplit.GetTopLeft().x, cToSplit.GetTopLeft().y, ptP01) ; + GetPoint( dSplitValue, cToSplit.GetTopRight().y, ptP11) ; + } + else { + GetPoint( dSplitValue, cToSplit.GetBottomLeft().y, ptP00) ; + GetPoint( cToSplit.GetBottomRight().x, cToSplit.GetBottomRight().y, ptP10) ; + GetPoint( dSplitValue, cToSplit.GetTopLeft().y, ptP01) ; + GetPoint( cToSplit.GetTopRight().x, cToSplit.GetTopRight().y, ptP11) ; + } + if( AreSamePointApprox( ptP00, ptP10) && AreSamePointApprox( ptP01, ptP11)) + bGoodSplitVert = false ; + } + if( bGoodSplitHoriz) { + if( cToSplit.GetTopLeft().y - dSplitValue > dSplitValue - cToSplit.GetBottomLeft().y) { + GetPoint( cToSplit.GetBottomLeft().x, cToSplit.GetBottomLeft().y, ptP00) ; + GetPoint( cToSplit.GetBottomRight().x, cToSplit.GetBottomRight().y, ptP10) ; + GetPoint( cToSplit.GetTopLeft().x, dSplitValue, ptP01) ; + GetPoint( cToSplit.GetTopRight().x, dSplitValue, ptP11) ; + } + else { + GetPoint( cToSplit.GetBottomLeft().x, dSplitValue, ptP00) ; + GetPoint( cToSplit.GetBottomRight().x, dSplitValue, ptP10) ; + GetPoint( cToSplit.GetTopLeft().x, cToSplit.GetTopLeft().y, ptP01) ; + GetPoint( cToSplit.GetTopRight().x, cToSplit.GetTopRight().y, ptP11) ; + } + if( AreSamePointApprox( ptP00, ptP01) && AreSamePointApprox( ptP10, ptP11)) + bGoodSplitHoriz = false ; + } + + if ( bGoodSplitVert || bGoodSplitHoriz) { cToSplit.m_dSplit = dSplitValue ; Cell cChild1, cChild2 ; cChild1.m_nDepth = cToSplit.m_nDepth + 1 ; @@ -734,7 +769,7 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax) bParamDimOk = ( pcToSplit->GetTopRight().y - pcToSplit->GetBottomLeft().y) / 2 > 100 * EPS_PARAM ; bool bDimOk = ( dSideMinVal / 2 >= dSideMin || ( dSideMinVal < EPS_SMALL && dLengMinVal / 2 >= dSideMin)) && bParamDimOk ; if ( dSideMaxVal > dSideMax) { - bSplit = true ; + bSplit = true ; //LOG_DBG_INFO( GetEGkLogger(), " Split by SideMax") } else if ( dSagV > dLinTol || dSagU > dLinTol) {