EgtGeomKernel :
- modificata la CreateBySetOfCurves.
This commit is contained in:
+1
-3
@@ -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
@@ -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
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user