EgtGeomKernel :

- modificata la CreateBySetOfCurves.
This commit is contained in:
Daniele Bariletti
2024-09-17 17:27:31 +02:00
parent bfc09d135c
commit e9e897593b
3 changed files with 73 additions and 27 deletions
+1 -3
View File
@@ -1279,10 +1279,8 @@ GetSurfBezierSkinned( const CICURVEPVECTOR& vCrv, double dLinTol)
// creo e setto la superficie trimesh
PtrOwner<SurfBezier> 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) ;
}
+71 -23
View File
@@ -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<ICurveComposite> 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<ICurveComposite> 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) ;
+1 -1
View File
@@ -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 ;