EgtGeomKernel 2.6j1 :
- piccoli ritocchi a superfici di Bezier.
This commit is contained in:
Binary file not shown.
+25
-23
@@ -1987,7 +1987,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
Point3d pt3DEnd ; pCrv0->GetEndPoint( pt3DEnd) ;
|
||||
bool bThroughEdge = false ;
|
||||
BOOLVECTOR vbThroughEdge ;
|
||||
if ( ! UnprojectPoint(pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut))
|
||||
if ( ! UnprojectPoint( pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut))
|
||||
return false ;
|
||||
vbThroughEdge.push_back( bThroughEdge) ;
|
||||
|
||||
@@ -2034,7 +2034,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
return false ;
|
||||
|
||||
// se il precedente era passato attraverso l'edge ed era un edge di polo allora devo sistemare le coordinate
|
||||
if( bPrevIsPole){
|
||||
if ( bPrevIsPole) {
|
||||
// se il punto precedente era di polo allora devo correggere le sue coordinate 2D
|
||||
if ( bHorizontalPole)
|
||||
pt2DPrev.x = pt2D.x ;
|
||||
@@ -2045,12 +2045,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
vtDir.Normalize() ;
|
||||
// se mi accorgo che sto per tracciare un taglio lungo un bordo posso semplicemente evitarlo
|
||||
double dDelta = 10 * EPS_SMALL ;
|
||||
if ( (1 - abs(vtDir.x) < SQ_EPS_SMALL && (pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi
|
||||
(1 - abs(vtDir.y) < SQ_EPS_SMALL && (pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi
|
||||
if ( ( 1 - abs( vtDir.x) < SQ_EPS_SMALL && ( pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi
|
||||
( 1 - abs( vtDir.y) < SQ_EPS_SMALL && ( pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi
|
||||
++ nRejected ;
|
||||
continue ;
|
||||
}
|
||||
if ( bThroughEdge && vbThroughEdge.back()) {
|
||||
if ( bThroughEdge && vbThroughEdge.back()) {
|
||||
double dParamH, dParamL ;
|
||||
dParamH = m_nSpanV * SBZ_TREG_COEFF ;
|
||||
dParamL = m_nSpanU * SBZ_TREG_COEFF ;
|
||||
@@ -2058,8 +2058,8 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
// ( i punti per periodicità hanno coordinate diverse anche se dovrebbero averle uguali, quindi il segmento attraversa tutto lo spazio parametrico, anche se in realtà è lungo il bordo di chiusura)
|
||||
// potrei star tracciando un taglio sul bordo di chiusura
|
||||
// controllo se sto tracciando una linea che unisce due lati di chiusura, allora in realtà sdtarei tracciando un taglio sull'edge e quindi posso non tracciarlo
|
||||
if ( (abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) ||
|
||||
(abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) {
|
||||
if ( ( abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) ||
|
||||
( abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) {
|
||||
++ nRejected ;
|
||||
continue ;
|
||||
}
|
||||
@@ -2073,12 +2073,14 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
Point3d ptNear ; pCrv0->GetStartPoint( ptNear) ;
|
||||
INTVECTOR vId ;
|
||||
bool bAdded = true ;
|
||||
while( chainC.GetChainFromNear( pt3D, false, vId)) {
|
||||
while ( chainC.GetChainFromNear( pt3D, false, vId)) {
|
||||
PtrOwner<ICurveComposite> pCC2D ( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCC2D))
|
||||
return false ;
|
||||
for ( int i = 0 ; i < int( vId.size()) ; ++ i) {
|
||||
// creo un segmento di retta
|
||||
ICurveLine* pLine( CreateCurveLine()) ;
|
||||
if ( pLine == nullptr)
|
||||
PtrOwner<ICurveLine> pLine( CreateCurveLine()) ;
|
||||
if ( IsNull( pLine))
|
||||
return false ;
|
||||
// recupero gli estremi (non vanno mai invertiti per opzione di concatenamento)
|
||||
int nInd = abs( vId[i]) - 1 ;
|
||||
@@ -2086,12 +2088,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
Point3d ptEnd = vBPnt[nInd].second ;
|
||||
// provo ad accodarlo alla composita
|
||||
bAdded = ( Dist( ptStart, ptEnd) > dToler / 2 &&
|
||||
pLine->Set( ptStart, ptEnd)) ;
|
||||
bAdded = bAdded && pCC2D->AddCurve( pLine, true, dToler) ;
|
||||
pLine->Set( ptStart, ptEnd)) ;
|
||||
bAdded = bAdded && pCC2D->AddCurve( Release( pLine), true, dToler) ;
|
||||
ptNear = ( bAdded ? ptEnd : ptStart) ;
|
||||
}
|
||||
if ( pCC2D->IsValid())
|
||||
vpCC.emplace_back( Release(pCC2D)) ;
|
||||
vpCC.emplace_back( Release( pCC2D)) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -2100,31 +2102,31 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
bool
|
||||
SurfBezier::AddCurveCompoToCuts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed, double dToler, const Plane3d* pPlCut) const
|
||||
{
|
||||
// se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando
|
||||
// se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando
|
||||
double dCrvLen ;
|
||||
if ( ! pCrvCompo->GetLength( dCrvLen) || dCrvLen < 5. * dToler)
|
||||
return true ;
|
||||
// se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene
|
||||
// se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene
|
||||
Point3d ptStart, ptEnd ;
|
||||
if ( pCrvCompo->GetStartPoint( ptStart) &&
|
||||
pCrvCompo->GetEndPoint( ptEnd) &&
|
||||
AreSamePointEpsilon( ptStart, ptEnd, 5. * dToler) &&
|
||||
! AreSamePointApprox( ptStart, ptEnd)) {
|
||||
// porto il punto finale a coincidere esattamente con l'inizio
|
||||
pCrvCompo->GetEndPoint( ptEnd) &&
|
||||
AreSamePointEpsilon( ptStart, ptEnd, 5 * dToler) &&
|
||||
! AreSamePointApprox( ptStart, ptEnd)) {
|
||||
// porto il punto finale a coincidere esattamente con l'inizio
|
||||
pCrvCompo->ModifyEnd( ptStart) ;
|
||||
}
|
||||
// unisco segmenti allineati
|
||||
// unisco segmenti allineati
|
||||
pCrvCompo->MergeCurves( 0.5 * dToler, ANG_TOL_STD_DEG) ;
|
||||
|
||||
// porto la curva nello spazio parametrico
|
||||
// porto la curva nello spazio parametrico
|
||||
ICRVCOMPOPVECTOR vCC ;
|
||||
if ( ! UnprojectCurveFromStm( pCrvCompo, vCC, pPlCut))
|
||||
return false ;
|
||||
for ( int i = 0 ; i < int( vCC.size()); ++i) {
|
||||
// le curve aperte le tengo da parte per giuntarle alla fine col bordo
|
||||
// le curve aperte le tengo da parte per giuntarle alla fine col bordo
|
||||
if ( ! vCC[i]->IsClosed() )
|
||||
vpCCOpen.emplace_back( vCC[i]) ;
|
||||
// le curve chiuse le metto tutte insieme subito
|
||||
// le curve chiuse le metto tutte insieme subito
|
||||
else
|
||||
vpCCClosed.emplace_back( vCC[i]) ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user