EgtGeomKernel :

- correzioni alle rigate con le Bezier.
This commit is contained in:
Daniele Bariletti
2024-07-03 11:15:10 +02:00
parent 9a16259ff5
commit d67cca385e
+61 -10
View File
@@ -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) ;