From 7043b2b318e5421e95813dd4d229bbd4fd29c926 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 1 Feb 2024 17:30:42 +0100 Subject: [PATCH] EgtGeomKernel : - corretti bug di identificazione EdgeIn e EdgeOut nel tracing dei loop di trim di sup. di Bezier. --- Tree.cpp | 102 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/Tree.cpp b/Tree.cpp index dbc8ec0..bc08b3a 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -2166,8 +2166,24 @@ Tree::FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool // determino il lato/vertice di uscita OnWhichEdge( nId, ptInters, nEdge) ; m_mTree[nId].m_vInters.back().nOut = nEdge ; - if ( (int)vptInters.size() == 0 || ! AreSamePointExact( ptInters , vptInters.back())) + // se è risultato che sono abbastanza vicino( di EPS_SMALL) ad un vertice allora il punto aggiunto sarà il vertice vero e proprio + if ( nEdge == 4) + ptInters = ptTl ; + else if ( nEdge == 5) + ptInters = ptBL ; + else if ( nEdge == 6) + ptInters = ptBr ; + else if ( nEdge == 7) + ptInters = ptTR ; + // aggiungo il nuovo punto al vettore delle intersezioni + if ( (int)vptInters.size() == 0 || ! AreSamePointApprox( ptInters , vptInters.back())) vptInters.push_back( ptInters) ; + else { + // se l'ultimo punto del vettore delle intersezioni è quasi uguale al punto che devo aggiungere allora lo sostituisco con quest'ultimo + vptInters.pop_back() ; + vptInters.push_back( ptInters) ; + } + // salvo il vettore intersezione per la cella e capisco in quale altra cella passare if ( (int)vptInters.size() == 1) m_mTree[nId].m_vInters.back().vpt.push_back( vptInters[0]) ; @@ -2546,40 +2562,74 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, INTVECTOR& vTo Vector3d vLast = ptLast - ptSecondToLast ; vLast.Normalize() ; Vector3d vEdge ; - if ( AreSameEdge( nEdge, 0)) { - if ( AreSamePointExact( ptLast, ptTl)) { - vEdge = m_mTree[nId].GetBottomLeft() - ptTl ; - vEdge.Normalize() ; - if ( AreOppositeVectorApprox( vLast, vEdge)) { + //if ( AreSameEdge( nEdge, 0)) { + // if ( AreSamePointExact( ptLast, ptTl)) { + // vEdge = m_mTree[nId].GetBottomLeft() - ptTl ; + // vEdge.Normalize() ; + // if ( AreOppositeVectorApprox( vLast, vEdge)) { + // plTrimmedPoly.EraseLastUPoint() ; + // nEdge = 1 ; + // } + // } + //} + //else if ( AreSameEdge( nEdge, 1) && AreSamePointExact( ptLast, m_mTree[nId].GetBottomLeft())) { + // vEdge = ptBr - m_mTree[nId].GetBottomLeft() ; + // vEdge.Normalize() ; + // if ( AreOppositeVectorApprox( vLast, vEdge)) { + // plTrimmedPoly.EraseLastUPoint() ; + // nEdge = 2 ; + // } + //} + //else if ( AreSameEdge( nEdge, 2)) { + // if ( AreSamePointExact( ptLast, ptBr)) { + // vEdge = m_mTree[nId].GetTopRight() - ptBr ; + // vEdge.Normalize() ; + // if ( AreOppositeVectorApprox( vLast, vEdge)) { + // plTrimmedPoly.EraseLastUPoint() ; + // nEdge = 3 ; + // } + // } + //} + //else if ( AreSameEdge( nEdge, 3) && AreSamePointExact( ptLast, m_mTree[nId].GetTopRight())) { + // vEdge = ptTl - m_mTree[nId].GetTopRight() ; + // vEdge.Normalize() ; + // if ( AreOppositeVectorApprox( vLast, vEdge)) { + // plTrimmedPoly.EraseLastUPoint() ; + // nEdge = 0 ; + // } + //} + + // estendo: se l'ultimo tratto è sovrapposto e controverso allora elimino l'ultimo punto + if ( nEdge == 0 || nEdge == 7 ) { + //vEdge = ptTl - m_mTree[nId].GetTopRight() ; + vEdge.Set( 1,0,0) ; + if ( AreOppositeVectorApprox( vLast, vEdge)) { + plTrimmedPoly.EraseLastUPoint() ; + nEdge = 0 ; + } + } + else if ( nEdge == 1 || nEdge == 4 ) { + //vEdge = ptBr - m_mTree[nId].GetBottomLeft() ; + vEdge.Set( 0,-1,0) ; + if ( AreOppositeVectorApprox( vLast, vEdge)) { plTrimmedPoly.EraseLastUPoint() ; nEdge = 1 ; - } } } - else if ( AreSameEdge( nEdge, 1) && AreSamePointExact( ptLast, m_mTree[nId].GetBottomLeft())) { - vEdge = ptBr - m_mTree[nId].GetBottomLeft() ; - vEdge.Normalize() ; + else if ( nEdge == 2 || nEdge == 5 ) { + //vEdge = ptTl - m_mTree[nId].GetTopRight() ; + vEdge.Set( -1,0,0) ; if ( AreOppositeVectorApprox( vLast, vEdge)) { - plTrimmedPoly.EraseLastUPoint() ; - nEdge = 2 ; + plTrimmedPoly.EraseLastUPoint() ; + nEdge = 2 ; } } - else if ( AreSameEdge( nEdge, 2)) { - if ( AreSamePointExact( ptLast, ptBr)) { - vEdge = m_mTree[nId].GetTopRight() - ptBr ; - vEdge.Normalize() ; - if ( AreOppositeVectorApprox( vLast, vEdge)) { + else if ( nEdge == 3 || nEdge == 6 ) { + //vEdge = m_mTree[nId].GetTopRight() - ptBr ; + vEdge.Set( 0,1,0) ; + if ( AreOppositeVectorApprox( vLast, vEdge)) { plTrimmedPoly.EraseLastUPoint() ; nEdge = 3 ; - } - } - } - else if ( AreSameEdge( nEdge, 3) && AreSamePointExact( ptLast, m_mTree[nId].GetTopRight())) { - vEdge = ptTl - m_mTree[nId].GetTopRight() ; - vEdge.Normalize() ; - if ( AreOppositeVectorApprox( vLast, vEdge)) { - plTrimmedPoly.EraseLastUPoint() ; - nEdge = 0 ; } }