From e9e897593ba5830c208cc6c8d2d8f71836582f67 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 17 Sep 2024 17:27:31 +0200 Subject: [PATCH] EgtGeomKernel : - modificata la CreateBySetOfCurves. --- SbzFromCurves.cpp | 4 +- SurfBezier.cpp | 94 +++++++++++++++++++++++++++++++++++------------ SurfBezier.h | 2 +- 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/SbzFromCurves.cpp b/SbzFromCurves.cpp index 4925389..368334a 100644 --- a/SbzFromCurves.cpp +++ b/SbzFromCurves.cpp @@ -1279,10 +1279,8 @@ GetSurfBezierSkinned( const CICURVEPVECTOR& vCrv, double dLinTol) // creo e setto la superficie trimesh PtrOwner pSbz( CreateBasicSurfBezier()) ; - if ( IsNull( pSbz) || ! pSbz->CreateBySetOfCurves( vCrvBez)) + if ( IsNull( pSbz) || ! pSbz->CreateBySetOfCurves( vCrvBez, true)) return nullptr ; - //// salvo tolleranza lineare usata - //pSbz->SetLinearTolerance( dLinTol) ; // restituisco la superficie return Release( pSbz) ; } \ No newline at end of file diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 14b39cf..06ee0e7 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1520,7 +1520,8 @@ SurfBezier::GetAuxSurf( void) const if ( m_pSTM != nullptr) return m_pSTM ; // eseguo calcolo - m_pSTM = GetApproxSurf( 50 * EPS_SMALL, 100 * EPS_SMALL) ; + //m_pSTM = GetApproxSurf( 50 * EPS_SMALL, 100 * EPS_SMALL) ; + m_pSTM = GetApproxSurf( 500 * EPS_SMALL, 100 * EPS_SMALL) ; //debug return m_pSTM ; } @@ -4898,29 +4899,46 @@ ChangeStartForClosed( PolyLine& plU0, PolyLine& plU1, ICurveComposite* pCrvU0, I //---------------------------------------------------------------------------- bool -SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) +SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez, bool bReduceToDeg3) { // uniformo le curve e determino il grado e il numero di span condiviso bool bRat = false ; int nDegU = 3 ; ICURVEPOVECTOR vCrvBezUnif ; DBLMATRIX mParam ; - // scorro le curve e uniformo tutte in curve di grado 3 non razionale - for ( int i = 0 ; i < int( vCrvBez.size()) ; ++i) { - const ICurveComposite* pCCFromSet = GetCurveComposite( vCrvBez[i]) ; - if( pCCFromSet == nullptr) - return false ; - PtrOwner pCC( CreateCurveComposite()) ; - for( int j = 0 ; j < int( pCCFromSet->GetCurveCount()) ; ++j) { - const ICurveBezier* pCrvBez = GetCurveBezier( pCCFromSet->GetCurve( j)) ; - if( pCrvBez == nullptr) - return false ; - if( ! pCC->AddCurve( EditBezierCurve( pCrvBez, nDegU, bRat))) - return false ; + if ( ! bReduceToDeg3) { + int nDegMax = 1 ; + //trovo il grado massimo + for ( int i = 0 ; i < int( vCrvBez.size()) ; ++i) { + const ICurveComposite* pCC = GetCurveComposite( vCrvBez[i]) ; + for ( int j = 0 ; j < int( pCC->GetCurveCount()) ; ++j) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( j)) ; + int nDeg = pCrvBez->GetDegree() ; + nDegMax = max( nDegMax, nDeg) ; + } + } + // porto tutte le curve al grado massimo + for ( int i = 0 ; i < int(vCrvBez.size()) ; ++i ) + vCrvBezUnif.emplace_back( EditBezierCurve( GetCurveBezier(vCrvBez[i]), nDegMax, false)) ; + } + else { + // scorro le curve e uniformo tutte in curve di grado 3 non razionale + for ( int i = 0 ; i < int( vCrvBez.size()) ; ++i) { + const ICurveComposite* pCCFromSet = GetCurveComposite( vCrvBez[i]) ; + if( pCCFromSet == nullptr) + return false ; + PtrOwner pCC( CreateCurveComposite()) ; + for( int j = 0 ; j < int( pCCFromSet->GetCurveCount()) ; ++j) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCCFromSet->GetCurve( j)) ; + if( pCrvBez == nullptr) + return false ; + if( ! pCC->AddCurve( EditBezierCurve( pCrvBez, nDegU, bRat))) + return false ; + } + mParam.emplace_back() ; + ParametrizeByLen( pCC, mParam.back()) ; + vCrvBezUnif.emplace_back( Release( pCC)) ; } - mParam.emplace_back() ; - ParametrizeByLen( pCC, mParam.back()) ; - vCrvBezUnif.emplace_back( Release( pCC)) ; } // ora vado a splittare le curve in modo da avere una divisione condivisa DBLVECTOR vdCommonPar ; @@ -4933,32 +4951,61 @@ SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) int nSpanV = int( vCrvBezUnif.size()) - 1 ; PNTMATRIX vPntCrvs ; + //versione vecchia for ( int j = 0 ; j < nSpanU ; ++j ) { PNTVECTOR vPntCtrl0 ; PNTVECTOR vPntCtrl1 ; for ( int i = 0 ; i < int( vCrvBezUnif.size()) ; ++i) { - const ICurveComposite* pCC = GetCurveComposite(vCrvBezUnif[i]) ; - const ICurveBezier* pCrvBez = GetCurveBezier(pCC->GetCurve( j)) ; + const ICurveComposite* pCC = GetCurveComposite( vCrvBezUnif[i]) ; + const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( j)) ; if ( j == 0) - vPntCtrl0.push_back( pCrvBez->GetControlPoint(0)) ; - vPntCtrl1.push_back( pCrvBez->GetControlPoint(nDegU)) ; + vPntCtrl0.push_back( pCrvBez->GetControlPoint( 0)) ; + vPntCtrl1.push_back( pCrvBez->GetControlPoint( nDegU)) ; } if( j==0 ) vPntCrvs.push_back( vPntCtrl0) ; vPntCrvs.push_back( vPntCtrl1) ; } + + ////versione nuova + //for ( int j = 0 ; j < nSpanU ; ++j ) { + // for( int z = j== 0 ? 0 : 1 ; z < nDegU + 1 ; ++z) { + // PNTVECTOR vPntCtrl ; + // for ( int i = 0 ; i < int( vCrvBezUnif.size()) ; ++i) { + // const ICurveComposite* pCC = GetCurveComposite( vCrvBezUnif[i]) ; + // const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( j)) ; + // vPntCtrl.push_back( pCrvBez->GetControlPoint( z)) ; + // } + // vPntCrvs.push_back( vPntCtrl) ; + // } + //} + Init( nDegU, nDegV, nSpanU, nSpanV, false) ; // scorro le span for ( int s = 0 ; s < int( nSpanU) ; ++s) { // trovo la direzione media del parametro V Point3d ptMean = ORIG ; + + // verione vecchia for ( int i = 1 ; i < int( vPntCrvs[0].size()) ; ++i ) ptMean += vPntCrvs[s][i] ; ptMean /= int( vPntCrvs[0].size() - 1) ; Vector3d vtDirXGeneral = ptMean - vPntCrvs[s][0] ; + + // prendo le curve a gruppi di 3 per costruire la parabola per trovare la pendenza "intuitiva" della superficie in V for ( int g = 0 ; g < nSpanV - 1 ; ++g) { + //// versione nuova + //Vector3d vtDirXGeneral ; + //// devo scorrere la matrice a blocchi di nDegU + //for ( int z = s * nDegU ; z < ( s + 1) * nDegU + 1 ; ++z) { + // ptMean = ORIG ; + // for ( int i = g ; i < g + 3 ; ++i) + // ptMean += vPntCrvs[z][i] ; + // ptMean /= int( vPntCrvs[0].size() - 1) ; + // vtDirXGeneral += ptMean - vPntCrvs[z][g] ; + //} const ICurveComposite* pCC0 = GetCurveComposite( vCrvBezUnif[g]) ; const ICurveComposite* pCC1 = GetCurveComposite( vCrvBezUnif[g + 1]) ; const ICurveComposite* pCC2 = GetCurveComposite( vCrvBezUnif[g + 2]) ; @@ -4994,7 +5041,6 @@ SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) // calcolo il piano della parabola e porto i punti in quel riferimento Plane3d plParab ; plParab.Set( ptP0, ptP1, ptP2) ; Point3d ptStartV, ptEndV ; - //Vector3d vDirX = ptP2 - ptP0 ; DistPointLine dpl( ptP1, ptP0, ptP2, true) ; Point3d ptPerp ; dpl.GetMinDistPoint( ptPerp) ; Vector3d vtDirY = ptPerp - ptP1 ; @@ -5005,7 +5051,8 @@ SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) Vector3d vtDirCrv1 = ptEnd - ptStart ; Vector3d vtParabNorm = plParab.GetVersN() ; Vector3d vtDirZ = vtDirCrv1 * vtParabNorm > 0 ? vtParabNorm : - vtParabNorm ; - Vector3d vtDirX = vtDirXGeneral - (vtDirXGeneral * vtDirZ * vtDirZ) ; + //Vector3d vtDirX = vtDirXGeneral - (vtDirXGeneral * vtDirZ * vtDirZ) ; // versione vecchia + Vector3d vtDirX = ptP2 - ptP0 ; // versione vecchia vecchia if ( ! frParab.Set( ptP0, vtDirX, vtDirY, vtDirZ)) { vtDirY = vtDirZ ^ vtDirX ; if ( ! frParab.Set( ptP0, vtDirX, vtDirY, vtDirZ)) @@ -5047,6 +5094,7 @@ SurfBezier::CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) ptP5 = ( ptP1 + ptI2) / 2 ; ptP6 = ( ptP2 + ptI2) / 2 ; } + // setto i punti di controllo di collegamento tra le curve passate in input, per il terzetto di curve selezionate if ( g == 0) SetControlPoint( n + (s * nDegU) + (nDegU * nSpanU + 1) * (g * 3 + 1), ptP3) ; SetControlPoint( n + (s * nDegU) + (nDegU * nSpanU + 1) * (g * 3 + 2), ptP4) ; diff --git a/SurfBezier.h b/SurfBezier.h index 2e50e24..53b0e86 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -147,7 +147,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW bool CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const Vector3d& vtAx, double dAngRotDeg, double dMove) override ; bool CreateByPointCurve( const Point3d& pt, const ICurve* pCurve) override ; bool CreateByTwoCurves( const ICurve* pCurve1, const ICurve* pCurve2, int nType) override ; - bool CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez) ; + bool CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez, bool bReduceToDeg3) override ; public : // IGeoObjRW int GetNgeId( void) const override ;