From 93c87ee72088edf00c21a40809085f5a25dd869e Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 10 Sep 2024 12:30:01 +0200 Subject: [PATCH] EgtGeomKernel : - correzione alla triangolazione delle bilineari bezier. --- Tree.cpp | 51 +++++++++++++++++---------------------------------- 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/Tree.cpp b/Tree.cpp index fdb72cd..95c5db6 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -1037,40 +1037,23 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax) double dLen3 = Dist( ptP00, ptP01) ; bool bVert = false ; - // calcolo in quale direzione è meglio dividere in base allo stretch // in realtà visto che non parametro rispetto alla dimensione nel parametrico, così mi trovo a dividere con un quad-tree - Point3d ptPSrfU, ptPSrfV ; - double dU = 0, dV = 0 ; - double dDistU = 0, dDistV = 0 ; - PNTVECTOR vPtU, vPtV ; - if ( ! m_bMulti) { - bVert = ( max( dLen0, dLen2) > max( dLen1, dLen3)) ; - } - else { - for ( double i = 0.25 ; i < 1 ; i = i + 0.25) { - dU = ( ( 1 - i) * pcToSplit->GetBottomLeft().x + i * pcToSplit->GetTopRight().x) / SBZ_TREG_COEFF ; - dV = ( ( 1 - i) * pcToSplit->GetBottomLeft().y + i * pcToSplit->GetTopRight().y) / SBZ_TREG_COEFF ; - double dVLoc = ( pcToSplit->GetBottomLeft().y + pcToSplit->GetTopRight().y) / 2 / SBZ_TREG_COEFF ; - double dULoc = ( pcToSplit->GetBottomLeft().x + pcToSplit->GetTopRight().x) / 2 / SBZ_TREG_COEFF ; - m_pSrfBz->GetPointD1D2( dU, dVLoc, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptPSrfU) ; - m_pSrfBz->GetPointD1D2( dULoc, dV, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptPSrfV) ; - vPtU.push_back( ptPSrfU) ; - vPtV.push_back( ptPSrfV) ; - } - // devo guardare se i tre punti in vPtU e vPtV sono allineati - CurveLine clU, clV ; - clU.Set( vPtU[0], vPtU[1]) ; - clV.Set( vPtV[0], vPtV[1]) ; - DistPointCurve dpcU( vPtU[2], clU, false) ; - DistPointCurve dpcV( vPtV[2], clV, false) ; - dpcU.GetDist( dDistU) ; - dpcV.GetDist( dDistV) ; - if ( dDistU > dDistV) { - bVert = true ; - } - else { - bVert = false ; - } - } + ///per capire in quale direzione splittare devo guardare quale coppia di lati opposti è più sghemba + Vector3d vtU0 = ptP01 - ptP00 ; + Vector3d vtU1 = ptP11 - ptP10 ; + double dLU0, dFU0, dTU0, dLU1, dFU1, dTU1 ; + vtU0.ToSpherical( &dLU0, &dFU0, &dTU0) ; + vtU1.ToSpherical( &dLU1, &dFU1, &dTU1) ; + double dSkewnessV = abs( dFU1 - dFU0) + abs( dTU1 - dTU0) ; + Vector3d vtV0 = ptP10 - ptP00 ; + Vector3d vtV1 = ptP11 - ptP01 ; + double dLV0, dFV0, dTV0, dLV1, dFV1, dTV1 ; + vtV0.ToSpherical( &dLV0, &dFV0, &dTV0) ; + vtV1.ToSpherical( &dLV1, &dFV1, &dTV1) ; + double dSkewnessU = abs( dFV1 - dFV0) + abs( dTV1 - dTV0) ; + if( dSkewnessU > dSkewnessV) + bVert = false ; + else + bVert = true ; // verifico che la cella sia abbastanza grande da poter essere splittata double dSideMinVal = ( bVert ? max( dLen0, dLen2) : max( dLen1, dLen3)) ;