EgtGeomKernel 2.6j1 :

- piccoli ritocchi a superfici di Bezier.
This commit is contained in:
Dario Sassi
2024-10-02 17:25:24 +02:00
parent 0c0eb9ef8f
commit 0317c37557
2 changed files with 25 additions and 23 deletions
BIN
View File
Binary file not shown.
+25 -23
View File
@@ -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]) ;
}