EgtGeomKernel: - correzione al taglio di superfici di bezier con piani.
This commit is contained in:
+32
-25
@@ -1621,7 +1621,7 @@ SurfBezier::GetAuxSurf( void) const
|
||||
if ( m_pSTM != nullptr)
|
||||
return m_pSTM ;
|
||||
// eseguo calcolo
|
||||
m_pSTM = GetApproxSurf( 1000 * EPS_SMALL, 100 * EPS_SMALL) ;
|
||||
m_pSTM = GetApproxSurf( 50 * EPS_SMALL, 100 * EPS_SMALL) ;
|
||||
return m_pSTM ;
|
||||
}
|
||||
|
||||
@@ -2096,6 +2096,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
|
||||
// aggiungo tutti i successivi
|
||||
BIPNTVECTOR vBPnt ;
|
||||
|
||||
// per il primo punto non mi interessa sapere se è passato attraverso un edge, tanto ha già le coordinate parametriche giuste
|
||||
bThroughEdge = false ;
|
||||
int nRejected = 0 ;
|
||||
for ( int i = 0 ; i < int( pCC->GetCurveCount()) ; ++i) {
|
||||
@@ -2553,11 +2554,6 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
ICRVCOMPOPOVECTOR vpCCOpen ;
|
||||
ICRVCOMPOPOVECTOR vpCCClosed ;
|
||||
|
||||
// //debug
|
||||
// static int a = 0 ;
|
||||
// a += 1 ;
|
||||
// //debug
|
||||
|
||||
while ( chainC.GetChainFromNear( ptNear, false, vId)) {
|
||||
// creo una curva composita
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
@@ -2607,18 +2603,7 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
vpCCClosed.back()->FromPolyLine( vPLTria[i]) ;
|
||||
}
|
||||
|
||||
// //debug
|
||||
// // ora posso chiamare la costruzione dello spazio parametrico trimmato
|
||||
// if ( a == 2) {
|
||||
// vector<IGeoObj*> vObj ;
|
||||
// for ( int i = 0 ; i < int(vpCCOpen.size()) ; ++i)
|
||||
// vObj.push_back( vpCCOpen[i]->Clone()) ;
|
||||
// vObj.push_back( m_pTrimReg->Clone()) ;
|
||||
// vObj.push_back( this->Clone()) ;
|
||||
// SaveGeoObj( vObj, "D:\\Temp\\bezier\\triangolazione\\doppiaSTM\\curveOPEN.nge", 2) ;
|
||||
// }
|
||||
// //debug
|
||||
|
||||
// ora posso chiamare la costruzione dello spazio parametrico trimmato
|
||||
PtrOwner<ISurfFlatRegion> pSFR( CreateTrimRegionFromCuts( vpCCOpen, vpCCClosed)) ;
|
||||
if ( IsNull( pSFR) || ! pSFR->IsValid())
|
||||
return false ;
|
||||
@@ -2786,7 +2771,7 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in
|
||||
pSurfTm->GetVertex( nVert[0], vPT[0]) ;
|
||||
pSurfTm->GetVertex( nVert[1], vPT[1]) ;
|
||||
pSurfTm->GetVertex( nVert[2], vPT[2]) ;
|
||||
// devo capire se il trinagolo ha un vertice su un polo
|
||||
// devo capire se il triangolo ha un vertice su un polo
|
||||
int nVertOnPole = -1 ;
|
||||
int nEdge = -1 ;
|
||||
// do per scontato che al più un vertice possa essere in un polo
|
||||
@@ -2928,6 +2913,25 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for ( int p = 0 ; p < 3; ++p ) {
|
||||
//scorro sugli edge
|
||||
for (int ed = 0 ; ed < 4 ; ++ed) {
|
||||
// scorro sui tratti che compongono l'edge
|
||||
for ( int i = 0 ; i < int( m_mCCEdge[ed].size()) ; ++i) {
|
||||
if( m_mCCEdge[ed][i]->IsPointOn( vPT[p]) && vOn[p] == -1)
|
||||
vOn[p] = ed ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// anche se non ho un triangolo molto stretchato potrei avere il punto di polo con coordinate parametriche sballate
|
||||
bOneVertexOnClosureButNotPole = ((m_bClosedU && (vOn[0] == 1 || vOn[0] == 3)) && 0 != nVertOnPole) ||
|
||||
((m_bClosedU && (vOn[1] == 1 || vOn[1] == 3)) && 1 != nVertOnPole) ||
|
||||
((m_bClosedU && (vOn[2] == 1 || vOn[2] == 3)) && 2 != nVertOnPole) ||
|
||||
((m_bClosedV && (vOn[0] == 0 || vOn[0] == 2)) && 0 != nVertOnPole) ||
|
||||
((m_bClosedV && (vOn[1] == 0 || vOn[1] == 2)) && 1 != nVertOnPole) ||
|
||||
((m_bClosedV && (vOn[2] == 0 || vOn[2] == 2)) && 2 != nVertOnPole) ;
|
||||
}
|
||||
}
|
||||
// devo anche tener conto della possibilità che i lati siano collassati in poli
|
||||
if ( bIsPole || bNearPole) {
|
||||
@@ -2939,21 +2943,24 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in
|
||||
for ( int p = 0 ; p < 3; ++p) {
|
||||
if ( p != nVertOnPole) {
|
||||
if ( nEdge == 0 || nEdge == 2) {
|
||||
dRightY = nEdge == 0 ? dParamH : 0 ;
|
||||
if ( vPtPa[p].x > dRightX )
|
||||
dRightX= vPtPa[p].x ;
|
||||
// se un vertice è su un lato di chiusura, visto che sono vicino ad un polo, mi accerto che un lato del triangolo sia SUL lato di chiusura
|
||||
if( m_bClosedU && bOneVertexOnClosureButNotPole)
|
||||
if( m_bClosedU && bOneVertexOnClosureButNotPole) {
|
||||
dRightX = ( dParamL - vPtPa[p].x > vPtPa[p].x ? 0 : dParamL) ;
|
||||
dRightY = nEdge == 0 ? dParamH : 0 ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
else if ( nEdge == 1 || nEdge == 3) {
|
||||
// se un vertice è su un lato di chiusura, visto che sono vicino ad un polo, mi accerto che un lato del triangolo sia SUL lato di chiusura
|
||||
if( m_bClosedU && bOneVertexOnClosureButNotPole)
|
||||
dRightY = ( dParamH - vPtPa[p].y > vPtPa[p].y ? 0 : dParamH) ;
|
||||
|
||||
dRightX = nEdge == 1 ? 0 : dParamL ;
|
||||
if ( vPtPa[p].y < dRightY )
|
||||
if ( vPtPa[p].y > dRightY )
|
||||
dRightY = vPtPa[p].y ;
|
||||
if( m_bClosedV && bOneVertexOnClosureButNotPole) {
|
||||
dRightY = ( dParamH - vPtPa[p].y > vPtPa[p].y ? 0 : dParamH) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user