diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 8f54b90..051c639 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1519,7 +1519,6 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin) const // costruttore della superficie POLYLINEMATRIX vvPL ; //POLYLINEVECTOR vPL ; // per usare i polygon basic - //Tree Tree( this, true) ; Tree Tree ; if ( ! Tree.SetSurf( this, true)) return nullptr ; @@ -1546,7 +1545,7 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin) const } if ( ! Tree.GetPolygons( vvPL)) continue ; - //Tree.GetPolygonsBasic( vPL) ; // per usare i polygon basic + //Tree.GetPolygonsBasic( vPL, true) ; // per usare i polygon basic // aggiorno la chiusura della superficie m_bClosedU = m_bClosedU || Tree.IsClosedU() ; @@ -1570,7 +1569,6 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin) const return nullptr ; // prendo i punti di ogni polyline dell'albero, li triangolo e li porto in 3d - int c = 0 ; for ( POLYLINEVECTOR vPL : vvPL) { PNTVECTOR vPnt ; INTVECTOR vTria ; @@ -1597,7 +1595,6 @@ SurfBezier::GetApproxSurf( double dTol, double dSideMin) const vPnt[vTria[3*i+2]].x, vPnt[vTria[3*i+2]].y)) return nullptr ; } - ++c ; } // termino @@ -1761,7 +1758,6 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& if ( bThroughEdge) { // devo cambiare le coordinate di pt2DPrev per periodicità // capisco su quale lato è e lo porto sul lato opposto - Point3d pt = pt2DPrev ; if ( m_bClosedU) { if ( pt2DPrev.x < 1) pt2DPrev.x = m_nSpanU * SBZ_TREG_COEFF ; @@ -3466,7 +3462,6 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V IntersCurveCurve icc( *pCurve, *pAx) ; Point3d ptStart ; pCurve->GetStartPoint( ptStart) ; Point3d ptEnd ; pCurve->GetStartPoint( ptEnd) ; - int nPrevType = 0 ; for ( int i = 0 ; i < int(icc.GetIntersCount()) ; ++i) { IntCrvCrvInfo iccInfo ; icc.GetIntCrvCrvInfo( i, iccInfo) ; diff --git a/Tree.cpp b/Tree.cpp index f005dbe..96b1a30 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -1573,7 +1573,7 @@ Tree::GetPolygons( POLYLINEMATRIX& vPolygons) if ( ! m_bTrimmed) { vPolygons.clear() ; POLYLINEVECTOR vPolygonsBasic ; - GetPolygonsBasic( vPolygonsBasic) ; + GetPolygonsBasic( vPolygonsBasic, true) ; for ( PolyLine pl : vPolygonsBasic) { POLYLINEVECTOR vSinglePolygon ; vSinglePolygon.push_back( pl) ; @@ -1639,12 +1639,13 @@ Tree::GetPolygons( POLYLINEMATRIX& vPolygons) //---------------------------------------------------------------------------- bool -Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells) +Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, INTVECTOR vCells) { // condizioni per il calcolo dei poligoni di base if ( m_vPolygons.empty() || // se non li ho mai calcolati ( ! m_vPolygons.empty() && ! vCells.empty()) || // se ho già calcolato dei poligoni ma ne sto chiedendo di un altro gruppo di celle - ( vCells.empty() && m_vPolygons.size() != m_vnLeaves.size())) { // se sto chiedendo i poligoni di tutte le celle, ma i poligoni già calcolati sono meno delle celle + ( vCells.empty() && m_vPolygons.size() != m_vnLeaves.size()) || // se sto chiedendo i poligoni di tutte le celle, ma i poligoni già calcolati sono meno delle celle + bForTriangulation) { // oppure se sto chiedendo i poligoni per la triangolazione ( devo fare considerazioni particolari se ho dei poli sui lati del parametrico) m_vPolygons.clear() ; // se non ho dato un elenco di celle in input do per scontato che la chiamata sia per calcolare i poligoni di tutte le foglie if ( vCells.empty()) @@ -1778,53 +1779,55 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells) vVertices.push_back( m_mTree.at( nId).GetBottomLeft()) ; vnVert.push_back( int(vVertices.size()) - 1) ; - // ora devo controllare se uno dei lati della cella è collassato in un punto. - // se così, devo guardare se sui due lati adiacenti a quello di polo ho messo dei punti extra - // se ne ho messi solo su uno dei due allora devo togliere il vertice dell'altro lato - if ( AreSamePointApprox(m_mVert.at(nId).at(0), m_mVert.at(nId).at(1)) && ( vbBonusVert[1] || vbBonusVert[3])) { - // se ho punti bonus su entrambi i lati non devo fare nulla - if( ! ( vbBonusVert[1] && vbBonusVert[3])){ - // sennò devo togliere l'estremo del lato su cui NON ho punti bonus - if( vbBonusVert[1]) // lati contati a partire da quello sopra in senso CCW - vVertices.erase( vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW - else if ( vbBonusVert[3]) { - // dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto - vVertices.pop_back() ; - vVertices[0] = vVertices.end()[-1] ; + if ( bForTriangulation){ + // ora devo controllare se uno dei lati della cella è collassato in un punto. + // se così, devo guardare se sui due lati adiacenti a quello di polo ho messo dei punti extra + // se ne ho messi solo su uno dei due allora devo togliere il vertice dell'altro lato + if ( AreSamePointApprox(m_mVert.at(nId).at(0), m_mVert.at(nId).at(1)) && ( vbBonusVert[1] || vbBonusVert[3] ) ) { + // se ho punti bonus su entrambi i lati non devo fare nulla + if ( !( vbBonusVert[1] && vbBonusVert[3] ) ) { + // sennò devo togliere l'estremo del lato su cui NON ho punti bonus + if ( vbBonusVert[1] ) // lati contati a partire da quello sopra in senso CCW + vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW + else if ( vbBonusVert[3] ) { + // dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto + vVertices.pop_back() ; + vVertices[0] = vVertices.end()[-1] ; + } } } - } - if ( AreSamePointApprox(m_mVert.at(nId).at(1), m_mVert.at(nId).at(2)) && ( vbBonusVert[0] || vbBonusVert[2])) { - // se ho punti bonus su entrambi i lati non devo fare nulla - if( ! ( vbBonusVert[0] && vbBonusVert[2])){ - // sennò devo togliere l'estremo del lato su cui NON ho punti bonus - if( vbBonusVert[0]) // lati contati a partire da quello sopra in senso CCW - vVertices.erase( vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW - else if ( vbBonusVert[2]) - vVertices.erase( vVertices.begin() + vnVert[2]) ; - } - } - if ( AreSamePointApprox(m_mVert.at(nId).at(2), m_mVert.at(nId).at(3)) && ( vbBonusVert[1] || vbBonusVert[3])) { - // se ho punti bonus su entrambi i lati non devo fare nulla - if( ! ( vbBonusVert[1] && vbBonusVert[3])){ - // sennò devo togliere l'estremo del lato su cui NON ho punti bonus - if( vbBonusVert[1]) // lati contati a partire da quello sopra in senso CCW - vVertices.erase( vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW - else if ( vbBonusVert[3]) - vVertices.erase( vVertices.begin() + vnVert[3]) ; - } - } - if ( AreSamePointApprox(m_mVert.at(nId).at(3), m_mVert.at(nId).at(0)) && ( vbBonusVert[0] || vbBonusVert[2])) { - // se ho punti bonus su entrambi i lati non devo fare nulla - if( ! ( vbBonusVert[0] && vbBonusVert[2])){ - // sennò devo togliere l'estremo del lato su cui NON ho punti bonus - if( vbBonusVert[0]){ // lati contati a partire da quello sopra in senso CCW - // dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto - vVertices.pop_back() ; - vVertices[0] = vVertices.end()[-1] ; + if ( AreSamePointApprox(m_mVert.at(nId).at(1), m_mVert.at(nId).at(2)) && ( vbBonusVert[0] || vbBonusVert[2] ) ) { + // se ho punti bonus su entrambi i lati non devo fare nulla + if ( !( vbBonusVert[0] && vbBonusVert[2] ) ) { + // sennò devo togliere l'estremo del lato su cui NON ho punti bonus + if ( vbBonusVert[0] ) // lati contati a partire da quello sopra in senso CCW + vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW + else if ( vbBonusVert[2] ) + vVertices.erase(vVertices.begin() + vnVert[2]) ; + } + } + if ( AreSamePointApprox(m_mVert.at(nId).at(2), m_mVert.at(nId).at(3)) && ( vbBonusVert[1] || vbBonusVert[3] ) ) { + // se ho punti bonus su entrambi i lati non devo fare nulla + if ( !( vbBonusVert[1] && vbBonusVert[3] ) ) { + // sennò devo togliere l'estremo del lato su cui NON ho punti bonus + if ( vbBonusVert[1] ) // lati contati a partire da quello sopra in senso CCW + vVertices.erase(vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW + else if ( vbBonusVert[3] ) + vVertices.erase(vVertices.begin() + vnVert[3]) ; + } + } + if ( AreSamePointApprox(m_mVert.at(nId).at(3), m_mVert.at(nId).at(0)) && ( vbBonusVert[0] || vbBonusVert[2] ) ) { + // se ho punti bonus su entrambi i lati non devo fare nulla + if ( !( vbBonusVert[0] && vbBonusVert[2] ) ) { + // sennò devo togliere l'estremo del lato su cui NON ho punti bonus + if ( vbBonusVert[0] ) { // lati contati a partire da quello sopra in senso CCW + // dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto + vVertices.pop_back() ; + vVertices[0] = vVertices.end()[-1] ; + } + else if ( vbBonusVert[2] ) + vVertices.erase(vVertices.begin() + vnVert[3]) ; } - else if ( vbBonusVert[2]) - vVertices.erase( vVertices.begin() + vnVert[3]) ; } } @@ -3896,13 +3899,13 @@ Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges) // recupero i poligoni base delle celle sui bordi POLYLINEMATRIX mPL ; mPL.emplace_back() ; - GetPolygonsBasic( mPL[0], vEdges[0]) ; + GetPolygonsBasic( mPL[0], false, vEdges[0]) ; mPL.emplace_back() ; - GetPolygonsBasic( mPL[1], vEdges[1]) ; + GetPolygonsBasic( mPL[1], false, vEdges[1]) ; mPL.emplace_back() ; - GetPolygonsBasic( mPL[2], vEdges[2]) ; + GetPolygonsBasic( mPL[2], false, vEdges[2]) ; mPL.emplace_back() ; - GetPolygonsBasic( mPL[3], vEdges[3]) ; + GetPolygonsBasic( mPL[3], false, vEdges[3]) ; // scorro sui gruppi di polyline che rappresentano i poligoni delle celle lungo un lato for ( int i = 0 ; i < int( mPL.size()) ; ++i) { diff --git a/Tree.h b/Tree.h index da3042a..e5ffece 100644 --- a/Tree.h +++ b/Tree.h @@ -239,8 +239,9 @@ class Tree // dSideMin è lunghezza minima del lato di una cella nello spazio reale bool BuildTree_test( double dLinTol = LIN_TOL_STD, double dSideMin = 1, double dSideMax = INFINITO) ; bool GetPolygons( POLYLINEMATRIX& vPolygons) ; - bool GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells = {}) ; // restituisce il poligono corrispondente ad ogni cella foglia dell'albero - // ad ogni poligono sono stati aggiunti tutti i vertici dei vicini posizionati sui suoi lati + bool GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bFroTriangulation = false, INTVECTOR vCells = {}) ; // restituisce il poligono corrispondente ad ogni cella foglia dell'albero + // ad ogni poligono sono stati aggiunti tutti i vertici dei vicini posizionati sui suoi lati + // se richiesti per la triangolazione ad alcuni poligoni potrebbero venire tolti dei punti per evitare errori dovuti ad eventuali poli sui bordi del parametrico bool GetLeaves ( std::vector& vLeaves) const ; // restituisce gli indici delle foglie nell'albero bool GetEdges3D ( POLYLINEMATRIX& mPLEdges) ; // restituisce gli edge 3D come polyline bool GetSplitLoops( POLYLINEVECTOR& vPl) const // funzione che restituisce i loop splitatti ai confini delle celle