EgtGeomKernel :
- correzione alla SurfBzByScrewing.
This commit is contained in:
+16
-48
@@ -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]) ;
|
||||
|
||||
Reference in New Issue
Block a user