diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 0898d1e..1fe1e00 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -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 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 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 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 ; + } } } }