EgtGeomKernel :
- correzione alla triangolazione delle bilineari bezier.
This commit is contained in:
@@ -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)) ;
|
||||
|
||||
Reference in New Issue
Block a user