diff --git a/SurfBezier.cpp b/SurfBezier.cpp index ee450d1..e5977f7 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -2037,6 +2037,8 @@ bool SurfBezier::IncreaseUV( double& dUV, double dxy, bool bUOrV, double* dUVCopy, bool bModifyOrig) const { double dUVTest ; + if (dUVCopy == nullptr && !bModifyOrig) + return false ; if ( dUVCopy != nullptr) { *dUVCopy = dUV + dxy ; dUVTest = *dUVCopy ; @@ -2419,7 +2421,7 @@ SurfBezier::CreateTrimRegionFromCuts( ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVE // devo quindi trovare la prossima intersezione con un taglio int nInters = -1 ; double dNextCut = INFINITO ; - double dEndCurrentCut ; + double dEndCurrentCut = 0 ; for ( int i = 0 ; i < int( mInters[tiEnd].size()); ++i) { // se ho trovato l'intersezione con la fine del taglio corrente, salvo il parametro sul loop if ( mInters[tiEnd][i].IciB->dU > EPS_SMALL) @@ -2610,9 +2612,8 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) double dAreaMin = 1e30 ; bool bPos = false ; for ( int c = 0 ; c < int( pSFR->GetChunkCount()); ++c) { - PtrOwner pSurf( pSFR->CloneChunk( c)) ; - for ( int l = 0 ; l < pSurf->GetLoopCount( 0); ++l) { - PtrOwner pCrv( pSurf->GetLoop( 0, l)) ; + for ( int l = 0 ; l < pSFR->GetLoopCount( c); ++l) { + PtrOwner pCrv( pSFR->GetLoop( c, l)) ; double dArea ; pCrv->GetAreaXY( dArea) ; if ( abs( dArea) < dAreaMin) { nChunkMin = c ; @@ -2674,6 +2675,9 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) return false ; } + //// taglio la trimesh col piano // questa operazione richiederebbe di ricavare anche i nuovi edge 2D e edge3D, che normalmente sarebbero calcolati durante la GetAuxSurf dal tree + //m_pSTM->Cut( plPlane, bSaveOnEq) ; + // imposto ricalcolo della grafica m_OGrMgr.Reset() ; @@ -2882,7 +2886,7 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in (vOn[0] > 0 && 0 != nVertOnPole) || (vOn[1] > 0 && 1 != nVertOnPole) || (vOn[2] > 0 && 2 != nVertOnPole)) { - double dRightY ; + double dRightY = 0 ; // tengo per buone le coordinate dei vertici che NON sono sul bordo dello spazio parametrico for ( int p = 0 ; p < 3; ++p) { if ( vOn[p] == -1) { @@ -3219,10 +3223,10 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con bool bInters = false ; // devo controllare se i loop si appoggiano a bordi chiusi // se ne ho più di uno che si appoggia allora devo vedere se trovo dei gruppi di loop che in realtà in 3d sono un edge unico, ma nel 2d risultano a cavallo dell'edge di chiusura - PtrOwner pLoop( m_vCCLoop[l]->Clone()) ; + //PtrOwner pLoop( m_vCCLoop[l]->Clone()) ; for ( int j = 0 ; j < 4 ; ++j) { // il primo è un loop di trim, il secondo è un edge dello spazio parametrico - IntersCurveCurve icc( *pLoop, *vEdge[j]) ; + IntersCurveCurve icc( *m_vCCLoop[l], *vEdge[j]) ; ICCIVECTOR vICC ; for ( int i = 0 ; i < int(icc.GetIntersCount()) ; ++i ) { IntCrvCrvInfo iccInfo ; @@ -3242,7 +3246,7 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con // scorro i loop che fanno intersezioni con l'edge 0 ( V=1) e le riporto sull'edge opposto for ( pair vInters0 : vmInters[0]) { // scorro le intersezioni del loop - for ( IntCrvCrvInfo inters0 : vInters0.second) { + for ( IntCrvCrvInfo& inters0 : vInters0.second) { if ( ! inters0.bOverlap) continue ; Point3d ptStart0 = inters0.IciA[0].ptI ; @@ -3252,9 +3256,9 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con ptEnd0.y = 0 ; // scorro le intersezioni sull'edge opposto e quando trovo un loop che tra le sue intersezioni contiene uno dei punti che ho appena portato // su qusto edge allora cancello la parte comune - for ( pair vInters2 : vmInters[2] ) { + for ( auto& vInters2 : vmInters[2] ) { // scorro le intersezioni di questo loop - for ( IntCrvCrvInfo inters2 : vInters2.second) { + for ( IntCrvCrvInfo& inters2 : vInters2.second) { // se lo start o end del loop corrente è compreso tra lo start e l'end di un loop che fa intesezione sull'edge opposto allora // devo cancellare la parte comune Point3d ptStart2 = inters2.IciA[0].ptI ; @@ -3345,9 +3349,9 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con if ( m_bClosedU) { // scorro i loop che fanno intersezioni con l'edge 1 ( U=0) e le riporto sull'edge opposto - for ( pair vInters1 : vmInters[1]) { + for ( auto& vInters1 : vmInters[1]) { // scorro le intersezioni del loop - for ( IntCrvCrvInfo inters1 : vInters1.second) { + for ( IntCrvCrvInfo& inters1 : vInters1.second) { if ( ! inters1.bOverlap) continue ; Point3d ptStart1 = inters1.IciA[0].ptI ; @@ -3359,7 +3363,7 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con // su qusto edge allora cancello la parte comune for ( pair vInters3 : vmInters[3] ) { // scorro le intersezioni di questo loop - for ( IntCrvCrvInfo inters3 : vInters3.second) { + for ( IntCrvCrvInfo& inters3 : vInters3.second) { // se lo start o end del loop corrente è compreso tra lo start e l'end di un loop che fa intesezione sull'edge opposto allora // devo cancellare la parte comune Point3d ptStart3 = inters3.IciA[0].ptI ; diff --git a/Tree.cpp b/Tree.cpp index 077221e..1e8a251 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -2292,7 +2292,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) SetRightEdgeIn( nId) ; } - // devo riconoscere le celle dentro i loop che sono ancora con label nFlag2 = 0 + // devo riconoscere le celle dentro i loop che sono ancora con label m_bLabelled = false ResetTree() ; INTVECTOR vNeigh, vFirst ; GetRootNeigh( 1, vFirst) ; @@ -2308,7 +2308,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // mentre torno indietro a sinistra, mi fermo quando trovo una cella non processata ( con vicini a destra da cui non sono passato) while ( ! bAllDone) { // categorizzo la cella - m_mTree[nCell].m_nFlag2 = 1 ; + m_mTree[nCell].m_bLabelled = true ; CategorizeCell( nCell) ; bool bDone = false ; // fintanto che la cella ha tra i vicini a destra una cella non elaborata mi sposto a destra @@ -2317,7 +2317,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // verso la cella a destra più in basso da cui non sono ancora passato bool bProceeded = false ; for ( int i = 0 ; i < (int)vNeigh.size() ; ++ i) { - if ( m_mTree[vNeigh[i]].m_nFlag2 == 0) { + if ( m_mTree[vNeigh[i]].m_bLabelled == false) { nCell = vNeigh[i] ; bProceeded = true ; break ; @@ -2328,7 +2328,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) } else { //categorizzo la cella - m_mTree[nCell].m_nFlag2 = 1 ; + m_mTree[nCell].m_bLabelled = true ; CategorizeCell( nCell) ; } @@ -2340,7 +2340,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) //controllo che tra i vicini di destra ce ne sia almeno uno da cui non sono passato // ( e controllo che non sia una cella sul lato sinistro ( adiacenza in caso di superficie chiusa)) for ( int t: vNeigh) { - if ( m_mTree[t].m_nFlag2 == 0 ) { + if ( m_mTree[t].m_bLabelled == false ) { if ( ! m_bClosedU) { bDone = false ; break ; @@ -2368,7 +2368,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // però se sono già sul lato sinistro non cerco di spostarmi ancora più a sinistra. if ( ! m_mTree[nCell].m_bOnLeftEdge) { for ( int p = 0 ; p < (int)vNeigh.size() ; ++ p) { - if ( m_mTree[vNeigh[p]].m_nFlag2 != 0) { + if ( m_mTree[vNeigh[p]].m_bLabelled != false) { nCell = vNeigh[p] ; break ; } @@ -2379,7 +2379,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // se questa cella non è processata devo procedere alla cella più bassa non processata sul lato sinistro if ( vNeigh.empty() && m_mTree[nCell].IsProcessed()) { for ( int p = 0 ; p < (int)vFirst.size() ; ++ p) { - if ( m_mTree[vFirst[p]].m_nFlag2 == 0) { + if ( m_mTree[vFirst[p]].m_bLabelled == false) { nCell = vFirst[p] ; break ; } @@ -2418,8 +2418,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) } if ( bDone) { m_mTree[nCell].SetProcessed( bDone) ; - if ( m_mTree[nCell].m_nFlag2 == 0) { - m_mTree[nCell].m_nFlag2 = 1 ; + if ( m_mTree[nCell].m_bLabelled == false) { + m_mTree[nCell].m_bLabelled = true ; CategorizeCell( nCell) ; } } diff --git a/Tree.h b/Tree.h index 67d5c8d..16ce8f8 100644 --- a/Tree.h +++ b/Tree.h @@ -164,7 +164,7 @@ class Cell ~Cell( void) {} Cell( void) : m_nId( -1),m_nTop ( -2), m_nBottom( -2), m_nLeft( -2), m_nRight ( -2), m_nParent( -2), m_nDepth( 0), - m_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_nFlag2( 0), m_nRightEdgeIn( -1), m_bOnLeftEdge( false), m_bOnTopEdge( false), m_nVertToErase( -1), + m_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_bLabelled( false), m_nRightEdgeIn( -1), m_bOnLeftEdge( false), m_bOnTopEdge( false), m_nVertToErase( -1), m_ptPbl( ORIG), m_ptPtr( SBZ_TREG_COEFF, SBZ_TREG_COEFF, 0), m_bProcessed( false), m_bSplitVert( true) { Point3d ptTr ( 1 * SBZ_TREG_COEFF, 1 * SBZ_TREG_COEFF) ; @@ -172,7 +172,7 @@ class Cell } Cell( const Point3d& ptBL, const Point3d& ptTR) : m_nId( -1),m_nTop ( -2), m_nBottom( -2), m_nLeft( -2), m_nRight ( -2), m_nParent( -2), m_nDepth( 0), - m_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_nFlag2( 0), m_nRightEdgeIn( -1), m_bOnLeftEdge( false), m_bOnTopEdge( false), m_nVertToErase( -1), + m_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_bLabelled( 0), m_nRightEdgeIn( -1), m_bOnLeftEdge( false), m_bOnTopEdge( false), m_nVertToErase( -1), m_ptPbl( ptBL), m_ptPtr( ptTR), m_bProcessed( false), m_bSplitVert( true) {} bool IsSame( const Cell& cOtherCell) const { return ( m_nId == cOtherCell.m_nId) ; } @@ -220,9 +220,9 @@ class Cell double m_dSplit ; // parametro a cui è stata splittata la cella int m_nChild1 ; // prima cella figlio int m_nChild2 ; // seconda cella figlio - int m_nFlag ; // falg che indica la caratterizzazione della cella rispetto ai loop di trim + int m_nFlag ; // flag che indica la caratterizzazione della cella rispetto ai loop di trim // 0 esterna, 1 intersecata, 2 contiene un loop, 3 intersecata e contenente un loop, 4 contenuta in un loop - int m_nFlag2 ; // falg che indica se la cella è stata attraversata durante l'ultima fase del labelling + bool m_bLabelled ; // flag che indica se la cella è stata attraversata durante l'ultima fase del labelling int m_nRightEdgeIn ; // 0 right edge fuori, 1 right edge dentro, 2 metà e metà bool m_bOnLeftEdge ; // flag che indica se la cella è sul lato sinistro ( per superfici chiuse sul parametro U) bool m_bOnTopEdge ; // flag che indica se la cella è sul lato top ( per superfici chiuse sul parametro V)