EgtGeomKernel :
- correzioni alle rigate con le Bezier.
This commit is contained in:
+61
-10
@@ -3875,7 +3875,7 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
if ( ( plU1.IsClosed() && plU1.GetPointNbr() < 3) || plU1.GetPointNbr() < 2)
|
||||
return false ;
|
||||
|
||||
// determino il numero di span che avrà lòa superficie basandomi sulla curva con più sottocurve
|
||||
// determino il numero di span che avrà la superficie basandomi sulla curva con più sottocurve
|
||||
int nSpanU = max( nSpanU0, nSpanU1) ;
|
||||
// punti per curva
|
||||
int nLastPoint = nDegU + 1 ;
|
||||
@@ -3886,8 +3886,6 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
// se sto usando la ISOPARM o la MINDIST semplice allora collego più span di una curva allo stesso punto
|
||||
// ( aggiungo virtualmente delle span alla curva che localmente ne ha di meno, semplicemente riprendo più volte lo stesso punto)
|
||||
if ( nRuledType != RLT_B_MINDIST_PLUS){
|
||||
// inizializzo la superficie
|
||||
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
|
||||
if ( nRuledType == RLT_B_MINDIST) {
|
||||
// creo le liste di punti per le isoparametriche in U
|
||||
PNTIVECTOR vPnt0Match, vPnt1Match ;
|
||||
@@ -3904,8 +3902,11 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
if ( nIndMatch != nIndMatchNext)
|
||||
nRep0 += nIndMatchNext - nIndMatch - 1;
|
||||
}
|
||||
int nRep1 = int( vPnt1Match.size() - 1) - vPnt0Match.back().second ;
|
||||
// reinizializzo la superficie con il nuovo numero di span in U
|
||||
nSpanU = nSpanU0 + nRep0 ;
|
||||
nSpanU = nSpanU0 + nRep0 + nRep1 ;
|
||||
if ( nSpanU < max(nSpanU0, nSpanU1))
|
||||
nSpanU = max(nSpanU0, nSpanU1) ;
|
||||
nSecondRowInd = nDegU * nSpanU + 1 ;
|
||||
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
|
||||
|
||||
@@ -3942,7 +3943,6 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
}
|
||||
else {
|
||||
// ripeto l'ultimo punto aggiunto per il numero di curve balzate della seconda curva - 1
|
||||
// aggiungo una sottocurva dalla prima curva
|
||||
for( int k = 0 ; k < nIndMatchNext - nIndMatch - 1 ; ++k) {
|
||||
pSubCrv0 = GetCurveBezier( pCrvU0->GetCurve( i != 0 ? i - 1 : i)) ;
|
||||
for ( int j = nCount0 == 0 ? 0 : 1 ; j < nLastPoint ; ++j) {
|
||||
@@ -3979,6 +3979,40 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
}
|
||||
}
|
||||
|
||||
//controllo se ho aggiunto tutti i punti della seconda curva
|
||||
if ( vPnt0Match.back().second != nSpanU1) {
|
||||
// riaggiungo l'ultimo punto
|
||||
const ICurveBezier* pSubCrv0 = GetCurveBezier( pCrvU0->GetCurve( nSpanU0 - 1)) ;
|
||||
int nPoint = nDegU ;
|
||||
while( nCount0 - 1 < nSpanU1) {
|
||||
for ( int j = 1 ; j < nLastPoint ; ++j) {
|
||||
if ( ! bRat0)
|
||||
SetControlPoint( nCount0 * nDegU + j, pSubCrv0->GetControlPoint( nPoint)) ;
|
||||
else
|
||||
SetControlPoint( nCount0 * nDegU + j, pSubCrv0->GetControlPoint( nPoint), pSubCrv0->GetControlWeight( nPoint)) ;
|
||||
}
|
||||
++ nCount0 ;
|
||||
}
|
||||
|
||||
// aggiungo le restanti sottocurve della curva 2
|
||||
int nCrv1 = vPnt0Match.back().second ;
|
||||
while( nCrv1 < nSpanU1) {
|
||||
const ICurveBezier* pSubCrv1 = GetCurveBezier( pCrvU1->GetCurve( nCrv1)) ;
|
||||
for ( int j = 1 ; j < nLastPoint ; ++j) {
|
||||
if ( ! bRat1)
|
||||
SetControlPoint( nSecondRowInd + nCount1 * nDegU + j, pSubCrv1->GetControlPoint( j)) ;
|
||||
else
|
||||
SetControlPoint( nSecondRowInd + nCount1 * nDegU + j, pSubCrv1->GetControlPoint( j), pSubCrv1->GetControlWeight( j)) ;
|
||||
}
|
||||
++ nCount1 ;
|
||||
++ nCrv1 ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////// ORA SI PUò CANCELLARE
|
||||
//// // QUESTO PEZZO E' DA SISTEMARE
|
||||
//// controllo di aver aggiunto anche gli ultimi punti
|
||||
//int nInd = nIndMatchNext < nSpanU0 ? nIndMatchNext : nIndMatchNext - 1 ;
|
||||
@@ -4043,6 +4077,8 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
}
|
||||
|
||||
if ( nRuledType == RLT_B_ISOPAR) {
|
||||
// inizializzo la superficie
|
||||
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
|
||||
Point3d ptP0Start ; pCrvU0->GetStartPoint( ptP0Start) ;
|
||||
Point3d ptP1Start ; pCrvU1->GetStartPoint( ptP1Start) ;
|
||||
// setto i primi due punti delle righe
|
||||
@@ -4167,6 +4203,8 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
int nAtStart1 = 0 ;
|
||||
int nAtEnd1 = 0 ;
|
||||
Point3d ptP0 ; plU0.GetFirstPoint( ptP0) ;
|
||||
int c = 0 ; // debug
|
||||
int nCrvCount = 0 ;
|
||||
while ( plU0.GetNextPoint( ptP0, true)) {
|
||||
// devo salvarmi se matcho più punti con lo start o l'end della curva totale
|
||||
DistPointCurve dpc( ptP0, *pCrvU1, false) ;
|
||||
@@ -4181,13 +4219,18 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
continue ;
|
||||
}
|
||||
Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ; // devo verificare se ho già un punto di start/end nelle vicinanze
|
||||
nCrvCount = pCrvU1->GetCurveCount() ; //debug
|
||||
pCrvU1->AddJoint( dParam) ;
|
||||
if( nCrvCount == pCrvU1->GetCurveCount())//debug
|
||||
int a = 0 ; //debug
|
||||
nSpanU1 = pCrvU1->GetCurveCount() ;
|
||||
// devo aggiungere un controllo in modo che i parametri trovati siano sempre crescenti
|
||||
++c ;// debug
|
||||
}
|
||||
int nAtStart0 = 0 ;
|
||||
int nAtEnd0 = 0 ;
|
||||
Point3d ptP1 ; plU1.GetFirstPoint( ptP1) ;
|
||||
c = 0 ;// debug
|
||||
while ( plU1.GetNextPoint( ptP1, true)) {
|
||||
DistPointCurve dpc( ptP1, *pCrvU0, false) ;
|
||||
int nFlag = 0 ;
|
||||
@@ -4201,16 +4244,24 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int
|
||||
continue ;
|
||||
}
|
||||
Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ; // devo verificare se ho già un punto di start/end nelle vicinanze
|
||||
nCrvCount = pCrvU0->GetCurveCount() ; // debug
|
||||
pCrvU0->AddJoint( dParam) ;
|
||||
if( nCrvCount == pCrvU0->GetCurveCount())
|
||||
int a = 0 ;
|
||||
nSpanU0 = pCrvU0->GetCurveCount() ;
|
||||
++c ;// debug
|
||||
}
|
||||
nSpanU = max( nSpanU0, nSpanU1) ;
|
||||
|
||||
// se la differenza tra il numero di span delle due curve non è colmata dalla ripetizione dello start o dello'end allora devo tenere conto anche
|
||||
// delle addJoint che non hanno fatto nulla ( perché chieste di splittare la curva troppo vicino ad un punto già esistente di split, magari in un caso anche di multimatch per lo stesso punto)
|
||||
if ( (nSpanU0 > nSpanU1 && nSpanU0 != nSpanU1 + nAtStart1 + nAtEnd1) ||
|
||||
(nSpanU0 < nSpanU1 && nSpanU1 != nSpanU0 + nAtStart0 + nAtEnd0))
|
||||
return false ;
|
||||
|
||||
// questo controllo SERVE??? è da cambiare per tenere dentro anche il caso di mismatch??
|
||||
//// se la differenza tra il numero di span delle due curve non è colmata dalla ripetizione dello start o dell'end allora devo tenere conto anche
|
||||
//// delle addJoint che non hanno fatto nulla ( perché chieste di splittare la curva troppo vicino ad un punto già esistente di split, magari in un caso anche di multimatch per lo stesso punto)
|
||||
//if ( (nSpanU0 > nSpanU1 && nSpanU0 != nSpanU1 + nAtStart1 + nAtEnd1) ||
|
||||
// (nSpanU0 < nSpanU1 && nSpanU1 != nSpanU0 + nAtStart0 + nAtEnd0))
|
||||
// return false ;
|
||||
|
||||
|
||||
nSecondRowInd = nDegU * nSpanU + 1 ;
|
||||
// inizializzo la superficie
|
||||
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
|
||||
|
||||
Reference in New Issue
Block a user