EgtGeomKernel :
- correzione alla triangolazione delle Bezier - correzione alla conversione da NURBS razionali a Bezier - correzione della funzione Invert per le Bezier.
This commit is contained in:
@@ -217,21 +217,24 @@ Tree::SetSurf( const SurfBezier* pSrfBz, const bool bSplitPatches, const Point3d
|
||||
m_bClosedV = true ;
|
||||
}
|
||||
for ( int i = 1 ; i < nSpanU ; ++i) {
|
||||
if ( i * SBZ_TREG_COEFF > ptMin.x && i * SBZ_TREG_COEFF < ptTop.x){
|
||||
// chiedo che il taglio disti dal bordo almeno il 2% della singola patch (1000 x 1000)
|
||||
if ( i * SBZ_TREG_COEFF > ptMin.x + 5 && i * SBZ_TREG_COEFF < ptTop.x - 5){
|
||||
m_mTree[nId].SetSplitDirVert( true) ;
|
||||
Split( nId, i * SBZ_TREG_COEFF) ;
|
||||
++ nId ;
|
||||
++ nId ;
|
||||
if ( Split( nId, i * SBZ_TREG_COEFF)) {
|
||||
++ nId ;
|
||||
++ nId ;
|
||||
}
|
||||
}
|
||||
}
|
||||
INTVECTOR vLeaves ;
|
||||
GetHeightLeaves( -1, vLeaves) ;
|
||||
for ( int nId : vLeaves) {
|
||||
for ( int j = nSpanV - 1 ; j > 0 ; --j) {
|
||||
if ( j * SBZ_TREG_COEFF > ptMin.y && j * SBZ_TREG_COEFF < ptTop.y){
|
||||
// chiedo che il taglio disti dal bordo almeno il 2% della singola patch (1000 x 1000)
|
||||
if ( j * SBZ_TREG_COEFF > ptMin.y + 5 && j * SBZ_TREG_COEFF < ptTop.y - 5){
|
||||
m_mTree[nId].SetSplitDirVert( false) ;
|
||||
Split( nId, j * SBZ_TREG_COEFF) ;
|
||||
nId = m_mTree[nId].m_nChild2 ;
|
||||
if ( Split( nId, j * SBZ_TREG_COEFF))
|
||||
nId = m_mTree[nId].m_nChild2 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -428,7 +431,7 @@ Tree::GetIndependentTrees( std::vector<std::tuple<Point3d,Point3d>>& vTrees)
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
bool
|
||||
Tree::Split( const int& nId, const double& dSplitValue)
|
||||
{
|
||||
// controllo che lo split non venga fatto sul lato della cella
|
||||
@@ -511,11 +514,13 @@ Tree::Split( const int& nId, const double& dSplitValue)
|
||||
}
|
||||
m_mTree[m_mTree[nId].m_nChild1].SetParent( nId) ;
|
||||
m_mTree[m_mTree[nId].m_nChild2].SetParent( nId) ;
|
||||
return true ;
|
||||
}
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
bool
|
||||
Tree::Split( const int& nId)
|
||||
{
|
||||
double dValue ;
|
||||
@@ -523,7 +528,7 @@ Tree::Split( const int& nId)
|
||||
dValue = ( m_mTree[nId].GetBottomLeft().x + m_mTree[nId].GetTopRight().x) / 2 ;
|
||||
else
|
||||
dValue = ( m_mTree[nId].GetBottomLeft().y + m_mTree[nId].GetTopRight().y) / 2 ;
|
||||
Split( nId, dValue) ;
|
||||
return Split( nId, dValue) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -606,7 +611,8 @@ Tree::BuildTree( const double& dLinTol, const double& dSideMin, const double& dS
|
||||
double dCurvU = 0, dCurvV = 0 ;
|
||||
double dLenParU = ( m_mTree[nCToSplit].GetTopRight().x - m_mTree[nCToSplit].GetBottomLeft().x) / SBZ_TREG_COEFF ;
|
||||
double dLenParV = ( m_mTree[nCToSplit].GetTopRight().y - m_mTree[nCToSplit].GetBottomLeft().y) / SBZ_TREG_COEFF ;
|
||||
if ( dLenParU <= 1. / m_nDegV || dLenParV <= 1. / m_nDegU) {
|
||||
if ( dLenParU <= 1. / m_nDegV || dLenParV <= 1. / m_nDegU || Dist(m_mVert[nCToSplit][0], m_mVert[nCToSplit][2]) < dSideMin * 2
|
||||
|| Dist(m_mVert[nCToSplit][1], m_mVert[nCToSplit][3]) < dSideMin * 2) {
|
||||
double dU = ( m_mTree[nCToSplit].GetTopRight().x + m_mTree[nCToSplit].GetBottomLeft().x) / 2 / SBZ_TREG_COEFF ;
|
||||
double dV = ( m_mTree[nCToSplit].GetTopRight().y + m_mTree[nCToSplit].GetBottomLeft().y) / 2 / SBZ_TREG_COEFF ;
|
||||
double dULoc = 0.5, dVLoc = 0.5 ;
|
||||
@@ -625,8 +631,8 @@ Tree::BuildTree( const double& dLinTol, const double& dSideMin, const double& dS
|
||||
// se sto ancora guardando una cella abbastanza grande
|
||||
else{
|
||||
Point3d ptPSrf, ptP00P10, ptP10P11, ptP11P01, ptP01P00, ptPSrfMid ;
|
||||
double dStep = 1. / m_nDegU ;
|
||||
for ( double k = dStep ; k < 1 ; k = k + dStep) {
|
||||
double dStep = 1. / ( m_nDegU * 2) ;
|
||||
for ( double k = dStep ; k < 1 + EPS_SMALL ; k = k + dStep) {
|
||||
double dU = ( k * m_mTree[nCToSplit].GetTopRight().x + ( 1 - k) * m_mTree[nCToSplit].GetBottomLeft().x) / SBZ_TREG_COEFF ;
|
||||
double dV = ( m_mTree[nCToSplit].GetTopRight().y + m_mTree[nCToSplit].GetBottomLeft().y) / 2 / SBZ_TREG_COEFF ;
|
||||
m_pSrfBz->GetPointD1D2( dU, dV, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptPSrf) ;
|
||||
@@ -641,11 +647,11 @@ Tree::BuildTree( const double& dLinTol, const double& dSideMin, const double& dS
|
||||
dpc.GetDist( dDist) ;
|
||||
dCurvV = std::max( dCurvV, dDist) ;
|
||||
}
|
||||
dStep = 1. / m_nDegV ;
|
||||
for ( double k = dStep ; k < 1 ; k = k + dStep) {
|
||||
dStep = 1. / ( m_nDegV * 2) ;
|
||||
for ( double k = dStep ; k < 1 + EPS_SMALL ; k = k + dStep) {
|
||||
double dU = ( m_mTree[nCToSplit].GetTopRight().x + m_mTree[nCToSplit].GetBottomLeft().x) / 2 / SBZ_TREG_COEFF ;
|
||||
double dV = ( k * m_mTree[nCToSplit].GetTopRight().y + ( 1 - k) * m_mTree[nCToSplit].GetBottomLeft().y) / SBZ_TREG_COEFF ;
|
||||
if ( k == 0.5)
|
||||
if ( k == 0.5 && ! AreSamePointApprox( ORIG, ptPSrfMid))
|
||||
ptPSrf = ptPSrfMid ;
|
||||
else
|
||||
m_pSrfBz->GetPointD1D2( dU, dV, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptPSrf) ;
|
||||
|
||||
Reference in New Issue
Block a user