EgtGeomKernel :

- correzione alla triangolazione delle bilineari bezier.
This commit is contained in:
Daniele Bariletti
2024-09-10 12:30:01 +02:00
parent a67a0502fa
commit 93c87ee720
+17 -34
View File
@@ -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)) ;