From 695350d3f6ea26ef3eaa424a37896ae81f566251 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 12 Jul 2024 12:04:41 +0200 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=20:=20-=20correzione=20per=20evit?= =?UTF-8?q?are=20errori=20di=20triangolazione=20in=20prossimit=C3=A0=20dei?= =?UTF-8?q?=20poli=20in=20sup=20di=20Bezier.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tree.cpp | 348 +++++++++++++++++++++++++++++++++---------------------- Tree.h | 9 +- 2 files changed, 216 insertions(+), 141 deletions(-) diff --git a/Tree.cpp b/Tree.cpp index aac78f5..0b26e2a 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -1611,6 +1611,10 @@ Tree::GetPolygons( POLYLINEMATRIX& vvPolygons, bool bForTriangulation, POLYLINEM else { POLYLINEVECTOR vPolygonsBasic ; GetPolygonsBasic( vPolygonsBasic) ; + POLYLINEVECTOR vPolygons ; + POLYLINEVECTOR vPolygonsBasic3d ; + if ( bForTriangulation) + GetPolygonsBasic( vPolygons, vPolygonsBasic3d) ; // aggiungo 4 elementi al vettore che contiene ciò che resta degli edge dopo il trim m_vCEdge2D.clear() ; for ( int i = 0 ; i < 4 ; ++i) { @@ -1620,11 +1624,6 @@ Tree::GetPolygons( POLYLINEMATRIX& vvPolygons, bool bForTriangulation, POLYLINEM // percorro i loop, trovo le intersezioni con le celle e le categorizzo if ( ! TraceLoopLabelCell( vPolygonsBasic)) return false ; - POLYLINEVECTOR vPolygonsBasic3d ; - if ( bForTriangulation) { - vPolygonsBasic.clear() ; - GetPolygonsBasic( vPolygonsBasic, vPolygonsBasic3d) ; - } // scorro sulle celle e costruisco i poligoni int nCells = int( vPolygonsBasic.size()) ; for ( int i = 0 ; i < nCells ; ++ i) { @@ -1858,6 +1857,9 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL vVertices3d.push_back( m_mVert[nId][0]) ; vnVert.push_back( int(vVertices.size()) - 1) ; + BOOLVECTOR vbKeepPoint( vVertices.size()) ; + fill( vbKeepPoint.begin(), vbKeepPoint.end(), true) ; + 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 @@ -1867,15 +1869,20 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL 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 - vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ; + //vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW + //vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ; + vbKeepPoint[vnVert[1]] = false ; + m_mTree[nId].m_nVertToErase = 1 ; // ptBr } 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] ; - vVertices3d.pop_back() ; - vVertices3d[0] = vVertices3d.end()[-1] ; + //// 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] ; + //vVertices3d.pop_back() ; + //vVertices3d[0] = vVertices3d.end()[-1] ; + vbKeepPoint[0] = false ; + vbKeepPoint.back() = false ; + m_mTree[nId].m_nVertToErase = 0 ; // ptBL } } } @@ -1884,12 +1891,16 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL 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 - vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ; + //vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW + //vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ; + vbKeepPoint[vnVert[1]] = false ; + m_mTree[nId].m_nVertToErase = 1 ; // ptBr } else if ( vbBonusVert[2] ){ - vVertices.erase(vVertices.begin() + vnVert[2]) ; - vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ; + //vVertices.erase(vVertices.begin() + vnVert[2]) ; + //vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ; + vbKeepPoint[vnVert[2]] = false ; + m_mTree[nId].m_nVertToErase = 2 ; // ptTR } } } @@ -1898,12 +1909,16 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL 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 - vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ; + //vVertices.erase(vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW + //vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ; + vbKeepPoint[vnVert[2]] = false ; + m_mTree[nId].m_nVertToErase = 2 ; // ptTR } else if ( vbBonusVert[3] ) { - vVertices.erase(vVertices.begin() + vnVert[3]) ; - vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ; + //vVertices.erase(vVertices.begin() + vnVert[3]) ; + //vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ; + vbKeepPoint[vnVert[3]] = false ; + m_mTree[nId].m_nVertToErase = 3 ; // ptTl } } } @@ -1912,15 +1927,20 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL 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] ; - vVertices3d.pop_back() ; - vVertices3d[0] = vVertices3d.end()[-1] ; + //// 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] ; + //vVertices3d.pop_back() ; + //vVertices3d[0] = vVertices3d.end()[-1] ; + vbKeepPoint[0] = false ; + vbKeepPoint.back() = false ; + m_mTree[nId].m_nVertToErase = 0 ; // ptBL } else if ( vbBonusVert[2] ) { - vVertices.erase(vVertices.begin() + vnVert[3]) ; - vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ; + //vVertices.erase(vVertices.begin() + vnVert[3]) ; + //vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ; + vbKeepPoint[vnVert[3]] = false ; + m_mTree[nId].m_nVertToErase = 3 ; // ptTl } } } @@ -1947,6 +1967,8 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL vVertices.back() = vVertices.at( 0) ; rotate( vVertices3d.begin(), vVertices3d.begin() + 1,vVertices3d.end()) ; vVertices3d.back() = vVertices3d.at( 0) ; + rotate( vbKeepPoint.begin(), vbKeepPoint.begin() + 1,vbKeepPoint.end()) ; + vbKeepPoint.back() = vbKeepPoint.at( 0) ; } } } @@ -1956,8 +1978,11 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL m_vPolygons3d.emplace_back() ; m_vPolygons3d.back().emplace_back() ; for ( int i = 0 ; i < (int) vVertices.size() ; ++i) { - m_vPolygons.back().back().AddUPoint( i, vVertices.at( i)) ; - m_vPolygons3d.back().back().AddUPoint( i, vVertices3d.at( i)) ; + int dPar = i ; + if( ! vbKeepPoint[i]) + dPar = -1 ; + m_vPolygons.back().back().AddUPoint( dPar, vVertices.at( i)) ; + m_vPolygons3d.back().back().AddUPoint( dPar, vVertices3d.at( i)) ; } } @@ -2281,7 +2306,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // trovo l'intersezione e passo alla cella successiva. nId viene aggiornato dalla funzione FindInters // se non trovo l'intersezione vuol dire che non sono nella cella giusta! // al precedente FindInters avrei dovuto passare di cella - if ( ! FindInters( nId, clTrim, vptInters, true)) { + if ( ! FindInters( nId, clTrim, vplPolygons[nIdPolygon], vptInters, true)) { // scarterò il punto molto vicino al lato e tengo solo l'intersezione del trim col lato if( vptInters.size() != 0) vptInters.pop_back() ; @@ -2291,7 +2316,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) clTrim.Set( ptTStart, ptTEnd) ; clTrim.ExtendEndByLen( EPS_SMALL * 2) ; clTrim.ExtendStartByLen( EPS_SMALL * 2) ; - if ( ! FindInters( nId, clTrim, vptInters, true)) + if ( ! FindInters( nId, clTrim, vplPolygons[nIdPolygon], vptInters, true)) return false ; bEraseNextPoint = true ; } @@ -2517,97 +2542,122 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) //---------------------------------------------------------------------------- bool -Tree::FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool bFirstInters) +Tree::FindInters( int& nId, const CurveLine& clTrim, const PolyLine& plPolygon, PNTVECTOR& vptInters, bool bFirstInters) { - CurveLine clEdge , clEdge2 ; - Point3d ptStart , ptEnd ; - clTrim.GetStartPoint( ptStart) ; - clTrim.GetEndPoint( ptEnd) ; - // trovo da quale lato sto uscendo Point3d ptTR = m_mTree[nId].GetTopRight() ; Point3d ptBL = m_mTree[nId].GetBottomLeft() ; Point3d ptTl( ptBL.x , ptTR.y) ; Point3d ptBr( ptTR.x , ptBL.y) ; int nEdge ; // flag che indica il lato su cui ho l'intersezione a partire dal lato top in senso antiorario - // oltre il 3 sono le celle adiacenti in diagonale al vertice-> 4 corrisponde al ptTl e da lì in senso antiorario - // -1 se la curva è sempre dentro la cella Point3d ptInters ; - //int nEdge2 ; - if ( ptEnd.y >= ptTR.y && ptEnd.x <= ptTR.x) { - //nEdge = 0 ; - // lato sopra - clEdge.Set( ptTR, ptTl) ; - // lato sinistro - if ( ptEnd.x < ptBL.x) { - //nEdge2 = 1 ; - clEdge2.Set( ptTl, ptBL) ; - } - } - else if ( ptEnd.x <= ptBL.x && ptEnd.y <= ptTR.y) { - nEdge = 1 ; - // lato sinistro - clEdge.Set( ptTl, ptBL) ; - // lato sotto - if ( ptEnd.y < ptBL.y) { - //nEdge2 = 2 ; - clEdge2.Set( ptBL, ptBr) ; - } - } - else if ( ptEnd.y <= ptBL.y && ptEnd.x >= ptBL.x) { - nEdge = 2 ; - // lato sotto - clEdge.Set( ptBL, ptBr) ; - // lato destro - if ( ptEnd.x > ptTR.x) { - //nEdge2 = 3 ; - clEdge2.Set( ptBr, ptTR) ; - } - } - else if ( ptEnd.x >= ptTR.x && ptEnd.y >= ptBL.y) { - nEdge = 3 ; - // lato desto - clEdge.Set( ptBr, ptTR) ; - // lato sopra - if ( ptEnd.y > ptTR.y) { - //nEdge2 = 0 ; - clEdge2.Set( ptTR, ptTl) ; - } - } - else - return false ; - bool bIntersFound = false ; - // intersezione e controlli - IntersLineLine illExit( clTrim, clEdge, true) ; - IntCrvCrvInfo aInfo, aInfo2 ; - if ( ! illExit.GetIntCrvCrvInfo( aInfo)) { - bIntersFound = false ; - if ( ! clEdge2.IsValid()) - return false ; + //CurveLine clEdge , clEdge2 ; + //Point3d ptStart , ptEnd ; + //clTrim.GetStartPoint( ptStart) ; + //clTrim.GetEndPoint( ptEnd) ; + //// trovo da quale lato sto uscendo + ////int nEdge ; // flag che indica il lato su cui ho l'intersezione a partire dal lato top in senso antiorario + //// oltre il 3 sono le celle adiacenti in diagonale al vertice-> 4 corrisponde al ptTl e da lì in senso antiorario + //// -1 se la curva è sempre dentro la cella + ////int nEdge2 ; + //if ( ptEnd.y >= ptTR.y && ptEnd.x <= ptTR.x) { + // //nEdge = 0 ; + // // lato sopra + // clEdge.Set( ptTR, ptTl) ; + // // lato sinistro + // if ( ptEnd.x < ptBL.x) { + // //nEdge2 = 1 ; + // clEdge2.Set( ptTl, ptBL) ; + // } + //} + //else if ( ptEnd.x <= ptBL.x && ptEnd.y <= ptTR.y) { + // nEdge = 1 ; + // // lato sinistro + // clEdge.Set( ptTl, ptBL) ; + // // lato sotto + // if ( ptEnd.y < ptBL.y) { + // //nEdge2 = 2 ; + // clEdge2.Set( ptBL, ptBr) ; + // } + //} + //else if ( ptEnd.y <= ptBL.y && ptEnd.x >= ptBL.x) { + // nEdge = 2 ; + // // lato sotto + // clEdge.Set( ptBL, ptBr) ; + // // lato destro + // if ( ptEnd.x > ptTR.x) { + // //nEdge2 = 3 ; + // clEdge2.Set( ptBr, ptTR) ; + // } + //} + //else if ( ptEnd.x >= ptTR.x && ptEnd.y >= ptBL.y) { + // nEdge = 3 ; + // // lato desto + // clEdge.Set( ptBr, ptTR) ; + // // lato sopra + // if ( ptEnd.y > ptTR.y) { + // //nEdge2 = 0 ; + // clEdge2.Set( ptTR, ptTl) ; + // } + //} + //else + // return false ; + + //bool bIntersFound = false ; + //// intersezione e controlli + //IntersLineLine illExit( clTrim, clEdge, true) ; + //IntCrvCrvInfo aInfo, aInfo2 ; + //if ( ! illExit.GetIntCrvCrvInfo( aInfo)) { + // bIntersFound = false ; + // if ( ! clEdge2.IsValid()) + // return false ; + //} + //else { + // bIntersFound = true ; + // if ( aInfo.bOverlap) + // ptInters = aInfo.IciA[1].ptI ; + // else + // ptInters = aInfo.IciA[0].ptI ; + //} + //if ( clEdge2.IsValid() && ! bIntersFound){ + // IntersLineLine illExit2( clTrim, clEdge2, true) ; + // // verifico su quale dei due lati ho l'intersezione + // if ( ! illExit2.GetIntCrvCrvInfo( aInfo2)) + // bIntersFound = false ; + // else { + // bIntersFound = true ; + // //// solo intersezione sul lato 2 + // if ( aInfo2.bOverlap) + // ptInters = aInfo2.IciA[1].ptI ; + // else + // ptInters = aInfo2.IciA[0].ptI ; + // } + //} + //if ( ! bIntersFound) + // return false ; + + PtrOwner pCC( CreateCurveComposite()) ; + PolyLine plSimplePolygon ; + plSimplePolygon = plPolygon ; + plSimplePolygon.RemoveAlignedPoints() ; + pCC->FromPolyLine( plSimplePolygon) ; + IntersCurveCurve icc( clTrim, *pCC) ; + IntCrvCrvInfo iccInfo ; + if ( icc.GetOverlaps()) { + for ( int i = 0 ; i < icc.GetIntersCount() ; ++i) { + icc.GetIntCrvCrvInfo( i, iccInfo) ; + if( iccInfo.bOverlap){ + ptInters = iccInfo.IciA[1].ptI ; + break ; + } + } } else { - bIntersFound = true ; - if ( aInfo.bOverlap) - ptInters = aInfo.IciA[1].ptI ; - else - ptInters = aInfo.IciA[0].ptI ; + int nLastInters = icc.GetIntersCount() -1 ; + icc.GetIntCrvCrvInfo( nLastInters, iccInfo) ; + ptInters = iccInfo.IciA[0].ptI ; } - if ( clEdge2.IsValid() && ! bIntersFound){ - IntersLineLine illExit2( clTrim, clEdge2, true) ; - // verifico su quale dei due lati ho l'intersezione - if ( ! illExit2.GetIntCrvCrvInfo( aInfo2)) - bIntersFound = false ; - else { - bIntersFound = true ; - //// solo intersezione sul lato 2 - if ( aInfo2.bOverlap) - ptInters = aInfo2.IciA[1].ptI ; - else - ptInters = aInfo2.IciA[0].ptI ; - } - } - if ( ! bIntersFound) - return false ; + // determino il lato/vertice di uscita OnWhichEdge( nId, ptInters, nEdge) ; m_mTree[nId].m_vInters.back().nOut = nEdge ; @@ -2945,24 +2995,41 @@ Tree::FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool //---------------------------------------------------------------------------- bool -Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vPolygons3d, INTVECTOR& vToCheck, int& nPoly, INTVECTOR& vnParentChunk, const PolyLine& plCell, const PolyLine& plCell3d) +Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vPolygons3d, INTVECTOR& vToCheck, int& nPoly, INTVECTOR& vnParentChunk, + const PolyLine& plCell, const PolyLine& plCell3d) { // conto quanti vertici in più ho per lato e creo un vettore dei vertici per lato int nId = m_vnLeaves[nLeafId] ; PNTMATRIX vEdgeVertex(4) ; PNTMATRIX vEdgeVertex3d(4) ; - vEdgeVertex[0].push_back( m_mTree[nId].GetTopRight()) ; - vEdgeVertex[1].push_back( m_mTree[nId].GetTopLeft()) ; - vEdgeVertex[2].push_back( m_mTree[nId].GetBottomLeft()) ; - vEdgeVertex[3].push_back( m_mTree[nId].GetBottomRight()) ; + Point3d ptBL = m_mTree[nId].GetBottomLeft() ; + Point3d ptTR = m_mTree[nId].GetTopRight() ; + Point3d ptTl = m_mTree[nId].GetTopLeft() ; + Point3d ptBr = m_mTree[nId].GetBottomRight() ; + int nVertToErase = m_mTree.at(nId).m_nVertToErase ; + if( nVertToErase != 2) + vEdgeVertex[0].push_back( ptTR) ; + if( nVertToErase != 3) + vEdgeVertex[1].push_back( ptTl) ; + if( nVertToErase != 0) + vEdgeVertex[2].push_back( ptBL) ; + if( nVertToErase != 1) + vEdgeVertex[3].push_back( ptBr) ; // capisco se sono in modalità ForTriangulation bool bForTriangulation = plCell3d.GetPointNbr() != 0 ; if ( bForTriangulation) { - vEdgeVertex3d[0].push_back( m_mVert[nId][2]) ; - vEdgeVertex3d[1].push_back( m_mVert[nId][3]) ; - vEdgeVertex3d[2].push_back( m_mVert[nId][0]) ; - vEdgeVertex3d[3].push_back( m_mVert[nId][1]) ; + if( nVertToErase != 2) + vEdgeVertex3d[0].push_back( m_mVert[nId][2]) ; + if( nVertToErase != 3) + vEdgeVertex3d[1].push_back( m_mVert[nId][3]) ; + if( nVertToErase != 0) + vEdgeVertex3d[2].push_back( m_mVert[nId][0]) ; + if( nVertToErase != 1) + vEdgeVertex3d[3].push_back( m_mVert[nId][1]) ; } + + + // la PolyLine è riempita a partire dal lato bottom Point3d ptStart, pt3d ; plCell.GetFirstPoint( ptStart) ; @@ -2975,7 +3042,14 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX if ( j == 3) next = 0 ; Point3d ptToAdd ; - while ( plCell.GetNextPoint( ptToAdd) && ! AreSamePointExact( ptToAdd, vEdgeVertex[next][0])) { + Point3d ptNextVert ; + switch ( next ) { + case 0 : ptNextVert = ptTR ; break ; + case 1 : ptNextVert = ptTl; break ; + case 2 : ptNextVert = ptBL ; break ; + case 3 : ptNextVert = ptBr ; break ; + } + while ( plCell.GetNextPoint( ptToAdd) && ! AreSamePointExact( ptToAdd, ptNextVert)) { vEdgeVertex[j].push_back( ptToAdd) ; if ( bForTriangulation) { plCell3d.GetNextPoint( pt3d) ; @@ -3101,13 +3175,13 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX while ( ! ( bValidNextStart && bAtNextStart) && bNotCameBack) { Point3d ptVert ; if ( nEdge == 0) - ptVert = vEdgeVertex[1][0] ; + ptVert = ptTl ; else if ( nEdge == 1) - ptVert = vEdgeVertex[2][0] ; + ptVert = ptBL ; else if ( nEdge == 2) - ptVert = vEdgeVertex[3][0] ; + ptVert = ptBr ; else if ( nEdge == 3) - ptVert = vEdgeVertex[0][0] ; + ptVert = ptTR ; AddVertex( nId, vEdgeVertex, vEdgeVertex3d, plTrimmedPoly, c, ptVert, plTrimmedPoly3d) ; if ( nEdge > 3 && nEdge != 7) nEdge = nEdge - 4 ; @@ -3155,13 +3229,13 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX while ( bNotCameBack) { Point3d ptVert ; if ( nEdge == 0) - ptVert = vEdgeVertex[1][0] ; + ptVert = ptTl ; else if ( nEdge == 1) - ptVert = vEdgeVertex[2][0] ; + ptVert = ptBL ; else if ( nEdge == 2) - ptVert = vEdgeVertex[3][0] ; + ptVert = ptBr ; else if ( nEdge == 3) - ptVert = vEdgeVertex[0][0] ; + ptVert = ptTR ; AddVertex( nId, vEdgeVertex, vEdgeVertex3d, plTrimmedPoly, c, ptVert, plTrimmedPoly3d) ; if ( nEdge > 3 && nEdge != 7) nEdge = nEdge - 4 ; @@ -3521,10 +3595,10 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe ++ c ; return true ; } - Point3d ptBr = vEdgeVertex[3][0] ; - Point3d ptTR = vEdgeVertex[0][0] ; - Point3d ptTl = vEdgeVertex[1][0] ; - Point3d ptBL = vEdgeVertex[2][0] ; + Point3d ptBr = m_mTree.at(nId).GetBottomRight() ; + Point3d ptTR = m_mTree.at(nId).GetTopRight() ; + Point3d ptTl = m_mTree.at(nId).GetTopLeft() ; + Point3d ptBL = m_mTree.at(nId).GetBottomLeft() ; Point3d ptLast ; plTrimmedPoly.GetLastPoint( ptLast) ; // verifico di essere allineato con un lato, sennò aggiungo e basta @@ -3584,7 +3658,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe plTrimmedPoly.AddUPoint( c, ptToAdd) ; if( bForTriangulation){ Point3d pt3d ; - if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[1][0])) + if( ! AreSamePointApprox(ptToAdd, ptTl)) m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ; else pt3d = vEdgeVertex3d[1][0] ; @@ -3606,7 +3680,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe plTrimmedPoly.AddUPoint( c, ptToAdd) ; if( bForTriangulation) { Point3d pt3d ; - if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[2][0])) + if( ! AreSamePointApprox(ptToAdd, ptBL)) m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ; else pt3d = vEdgeVertex3d[2][0] ; @@ -3628,7 +3702,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe plTrimmedPoly.AddUPoint( c, ptToAdd) ; if( bForTriangulation){ Point3d pt3d ; - if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[3][0])) + if( ! AreSamePointApprox(ptToAdd, ptBr)) m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ; else pt3d = vEdgeVertex3d[3][0] ; @@ -3650,7 +3724,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe plTrimmedPoly.AddUPoint( c, ptToAdd) ; if( bForTriangulation) { Point3d pt3d ; - if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[0][0])) + if( ! AreSamePointApprox(ptToAdd, ptTR)) m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ; else pt3d = vEdgeVertex3d[0][0] ; diff --git a/Tree.h b/Tree.h index 108efd4..1d0a45d 100644 --- a/Tree.h +++ b/Tree.h @@ -155,7 +155,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_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_nFlag2( 0), 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) ; @@ -163,7 +163,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_nChild1( -2), m_nChild2( -2), m_nFlag( -1), m_nFlag2( 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) ; } @@ -217,6 +217,7 @@ class Cell bool m_bOnTopEdge ; // flag che indica se la cella è sul lato top ( per superfici chiuse sul parametro V) std::vector m_vInters ; // vettore delle intersezioni della cella con i loop di trim // ogni elemento del vettore è l'insieme dei punti che caratterizza un attraversamento della cella + int m_nVertToErase ; // vertice da eliminare dal poligono della cella, in caso di lato sovrapposto ad un lato di polo private : Point3d m_ptPbl ; // punto bottom left @@ -273,8 +274,8 @@ class Tree void ResetTree( void) ; // resetto m_bProcessed a false per tutti i nodi dell'albero INTVECTOR FindCell( const Point3d& ptToAssign, const CurveLine& cl, bool bRecurs = false) const ; // dato un punto, trova la cella foglia a cui appartiene INTVECTOR FindCell( const Point3d& ptToAssign, const CurveLine& cl, INTVECTOR vCells, bool bRecurs = false) const ; // dato un punto, trova la cella foglia a cui appartiene - bool TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) ; // tracing dei loop e labelling delle celle - bool FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool bFirstInters = true) ; // trova le intersezioni tra una cella e una linea di trim + bool TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) ; // tracing dei loop e labelling delle celle + bool FindInters( int& nId, const CurveLine& clTrim, const PolyLine& plPolygon, PNTVECTOR& vptInters, bool bFirstInters = true) ; // trova le intersezioni tra una cella e una linea di trim // resituisce l'id della cella verso cui la curva di trim esce e il vettore delle intersezioni per la cella successiva con il primo punto bool CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vPolygons3d, INTVECTOR& vToCheck, int& nPoly, INTVECTOR& vnParentChunk, const PolyLine& plCell, const PolyLine& plCell3d) ; // crea i poligoni della cella passata. richiede anche la funzione CreateIslandAndHoles per completare i poligoni. bool CreateIslandAndHoles( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vvPolygons3d, int& nPoly, INTVECTOR& vnParentChunk, bool bForTriangulation) ; // ai poligoni generati da CreatePolygonsCell aggiunge i loop che creano isole o buchi all'interno della singola cella