EgtGeomKernel :

- correzione alla SurfBzByScrewing.
This commit is contained in:
Daniele Bariletti
2024-09-10 09:18:21 +02:00
parent 0cc63d40eb
commit cec0a48be4
+16 -48
View File
@@ -3810,9 +3810,16 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
PtrOwner<ICurveComposite> pCrvU ( CreateCurveComposite()) ;
// se la curva è già una bezier singola la tengo, sennò la converto
if ( pCurve->GetType() != CRV_BEZIER)
pCrvU->AddCurve( CurveToBezierCurve( pCurve)) ;
else
pCrvU->AddCurve( pCurve->Clone()) ;
pCrvU->AddCurve( CurveToBezierCurve( pCurve, 3, true)) ;
else {
if( GetCurveBezier(pCurve)->IsRational())
pCrvU->AddCurve( pCurve->Clone()) ;
else {
ICurveBezier* pCrvCopy = GetCurveBezier( pCurve->Clone()) ;
pCrvCopy->MakeRational() ;
pCrvU->AddCurve( pCrvCopy) ;
}
}
if ( IsNull( pCrvU) || ! pCrvU->IsValid())
return false ;
int nSpanU = int( pCrvU->GetCurveCount()) ;
@@ -3832,9 +3839,9 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
PtrOwner<ICurveArc> pSpiral( CreateCurveArc()) ;
pSpiral->SetCPAN( ptAx, ptCtrlU, dAngRotDeg, dMove, vtAx) ;
// converto in bezier la spirale
pCrvV->AddCurve( ArcToBezierCurve( pSpiral,true)) ;
pCrvV->AddCurve( ArcToBezierCurve( pSpiral,3 , true)) ;
const ICurveBezier* pFirstBez = GetCurveBezier( pCrvV->GetCurve( 0)) ;
int nDeg = pFirstBez->GetDegree() ; // questo è 3 o 2
int nDeg = pFirstBez->GetDegree() ;
for ( int k = 0 ; k < nDeg + 1 ; ++k)
vdSpiralW.push_back( pFirstBez->GetControlWeight( k)) ;
bFound = true ;
@@ -3851,51 +3858,12 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
// inizializzo la superficie
bool bRat = true ; // perché nella direzione del parametro V ho sicuramente delle razioniali
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
// ora posso settare i punti di controllo
// scorro le curve che compongono la spirale
Point3d ptPrev ; pCrvV->GetStartPoint( ptPrev) ;
Frame3d frRev ; frRev.Set( ptAx, vtAx) ;
PtrOwner<ICurveComposite> pCrvUNew( pCrvU->Clone()) ;
Vector3d vtDirPrev = ptPrev - ptAx ;
vtDirPrev.ToLoc( frRev) ;
// VERSIONE 1 // c'è qualcosa che non torna, probabilmente dovuto alla razionalità della spirale
//// faccio una rail della curva di base lungo la spirale
//for ( int j = 0 ; j < nSpanV ; ++j) {
// const ICurveBezier* pSubCrvBezV = GetCurveBezier( pCrvV->GetCurve( j)) ;
// for( int z = 0 ; z < nDegV + 1 ; ++z) {
// Point3d ptRef = pSubCrvBezV->GetControlPoint( z) ;
// double dWRef = pSubCrvBezV->GetControlWeight( z) ;
// ptRef *= dWRef ;
// Vector3d vtStepMove = ( ptRef - ptPrev) ;
// pCrvUNew->Translate( vtStepMove) ;
// // ruoto la curva base
// Vector3d vtDirNew = ptRef - ptAx ;
// vtDirNew.ToLoc( frRev) ;
// double dAng = 0 ;
// vtDirPrev.GetAngleXY( vtDirNew, dAng) ;
// pCrvUNew->Rotate( ptRef, vtAx, dAng) ;
// // scorro le curve che compongono la curva principale
// for ( int k = 0 ; k < nSpanU ; ++k ) {
// const ICurveBezier* pSubCrvBezU = GetCurveBezier( pCrvUNew->GetCurve( k)) ;
// // scorro i punti di controllo della sottocurva
// for ( int i = 0 ; i < nDegU + 1 ; ++i) {
// Point3d ptCtrl = pSubCrvBezU->GetControlPoint( i) ;
// ptCtrl /= dWRef ;
// double dW = pSubCrvBezU->GetControlWeight( i) ;
// SetControlPoint( nDegU * k + i, nDegV * j + z, ptCtrl, dW * dWRef) ;
// }
// }
// vtDirPrev = vtDirNew ;
// ptPrev = ptRef ;
// }
//}
// VERSIONE 2 // funziona
// per ogni punto di controllo della curva di base creo la spirale che rappresenta la screw di quel punto
// per ogni punto di controllo della curva di base creo la spirale che rappresenta la screw di quel punto
// scorro le sottocurve della curva di base
for ( int k = 0 ; k < nSpanU ; ++k ) {
const ICurveBezier* pSubCrvBezU = GetCurveBezier( pCrvUNew->GetCurve( k)) ;
const ICurveBezier* pSubCrvBezU = GetCurveBezier( pCrvU->GetCurve( k)) ;
//scorro i punti di controllo
for ( int i = 0 ; i < nDegU + 1 ; ++i) {
if ( k != 0 && i == 0)
@@ -3906,7 +3874,7 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
PtrOwner<ICurveComposite> pCrvV( CreateCurveComposite()) ;
// verifico se il punto di controllo sta sull'asse
// in tal caso anziché una spirale creo semplicemente una linea lungo l'asse
DistPointLine dpl( ptCtrlU, ptAx, vtAx, 0, false) ;
DistPointLine dpl( ptCtrlU, ptAx, vtAx, 1, false) ;
if ( ! dpl.IsSmall()) {
// creo la spirale e la converto in bezier
PtrOwner<ICurveArc> pSpiral( CreateCurveArc()) ;
@@ -3921,7 +3889,7 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
double dStep = 1. / nSpanV ;
for ( int j = 0 ; j < nSpanV ; ++j) {
PtrOwner<ICurveLine> pCLSingleSpan( GetCurveLine( pCL->CopyParamRange( j * dStep, ( j + 1) * dStep))) ;
PtrOwner<ICurveBezier> pCrvBezForm( LineToBezierCurve( pCLSingleSpan,true)) ;
PtrOwner<ICurveBezier> pCrvBezForm( LineToBezierCurve( pCLSingleSpan, 3, true)) ;
// prima di aggiungere le curve alla composito setto i pesi
for ( int z = 0 ; z < pCrvBezForm->GetDegree() + 1 ; ++z)
pCrvBezForm->SetControlWeight( z, vdSpiralW[z]) ;