From b2e799e1d6fc2212d5e23257f2f6b8e3bddff17d Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 24 Mar 2025 12:42:56 +0100 Subject: [PATCH] - ulteriore riduzione di copie di costruzione e copie di polyline in tree. --- SurfBezier.cpp | 34 ++-------------------------------- Tree.cpp | 41 ++++++++++++++++++++++++----------------- Tree.h | 12 ++++-------- 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index d875a6a..f5852f8 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1612,39 +1612,9 @@ bool SurfBezier::UpdateEdgesFromTree( Tree& tr) const { tr.GetEdges3D( m_mCCEdge) ; - //for ( int i= 0 ; i < int( mPlEdges.size()); ++i) { - // for ( int j = 0 ; j < int ( mPlEdges[i].size()) ; ++j) { - // m_mCCEdge[i].emplace_back(CreateBasicCurveComposite()) ; - // if ( ! m_mCCEdge[i].back()->FromPolyLine(mPlEdges[i][j]) ) { - // Point3d ptStart ; - // if ( ! mPlEdges[i][j].GetFirstPoint( ptStart)) - // continue ; - // m_mCCEdge[i].back()->FromPoint( ptStart) ; - // } - // } - //} - if ( m_bTrimmed) { - POLYLINEVECTOR vPl ; - tr.GetSplitLoops( vPl) ; - - // recupero i loop nel parametrico - for( int i = 0 ; i < int( vPl.size()); ++i) { - m_vCCLoop.emplace_back(CreateBasicCurveComposite()) ; - m_vCCLoop.back()->FromPolyLine(vPl[i]) ; - } - } - - // if ( m_bTrimmed) { - // //POLYLINEVECTOR vPl ; - // tr.GetSplitLoops( m_vCCLoop) ; - - // //// recupero i loop nel parametrico - // //for( int i = 0 ; i < int( vPl.size()); ++i) { - // // m_vCCLoop.emplace_back(CreateBasicCurveComposite()) ; - // // m_vCCLoop.back()->FromPolyLine(vPl[i]) ; - // //} - // } + if ( m_bTrimmed) + tr.GetSplitLoops( m_vCCLoop) ; return true ; } diff --git a/Tree.cpp b/Tree.cpp index 39fe8b7..184cb8b 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -223,7 +223,7 @@ Tree::SetSurf( const SurfBezier* pSrfBz, bool bSplitPatches, const Point3d& ptMi m_vPlApprox.clear() ; m_vPolygons.clear() ; m_vPolygonsCorr.clear() ; - m_vPlLoop2D.clear() ; + m_vCCLoop2D.clear() ; m_pSrfBz = pSrfBz ; m_bSplitPatches = bSplitPatches ; @@ -2280,13 +2280,21 @@ Tree::FindCell( const Point3d& ptToAssign, const CurveLine& cl, INTVECTOR vCells //---------------------------------------------------------------------------- bool -Tree::UpdateSplitLoop( PolyLine& pl, int& nCount, Point3d& pt) +Tree::UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) { Point3d ptLast ; - pl.GetLastPoint( ptLast) ; - if ( pl.AddUPoint( nCount, pt)) - ++ nCount ; - if ( pl.GetPointNbr() != 1 ) { + bool bAdded = false ; + if ( ! pCC->GetEndPoint( ptLast)) { + // potrei avere una compo vuota o con solo un punto + // se non riesco ad aggiungere una linea allora era una compo vuota + if ( ! pCC->AddLine( pt)) + pCC->AddPoint( pt) ; + bAdded = true ; + pCC->GetStartPoint( ptLast) ; + } + if( pCC->IsValid()) { + if ( ! bAdded) + pCC->AddLine( pt) ; Vector3d vtDir = pt - ptLast ; if ( ! vtDir.Normalize()) return false ; @@ -2324,9 +2332,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) // percorro i loop trovando le interezioni con le celle e riempiendo i vettori m_vInters delle varie celle for ( int i = 0 ; i < (int) m_vPlApprox.size() ; ++ i) { PolyLine plLoop = get<0>( m_vPlApprox[i]) ; - // creo la polyline che aggiunge alla polyline originale degli split dove interseca le celle ( serve per ricostruire gli edge aperti della superficie) - PolyLine plLoopSplit ; - int nPtLoopSplit = 0 ; + // creo la compo che aggiunge alla polyline originale degli split dove interseca le celle ( serve per ricostruire gli edge aperti della superficie) + PtrOwner pCCLoopSplit( CreateCurveComposite()) ; // controllo se il loop è CCW o CW bool bCCW = get<1>( m_vPlApprox[i]) ; // trovo in quale cella è il ptStart @@ -2338,8 +2345,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) advance( ptSecond, 1) ; CurveLine clFirst ; clFirst.Set( ptFirst->first, ptSecond->first) ; - // aggiorno la polyline splittata - UpdateSplitLoop( plLoopSplit, nPtLoopSplit, ptFirst->first) ; + // aggiorno la compo splittata + UpdateSplitLoop( pCCLoopSplit, ptFirst->first) ; // individuo la cella da cui parte il loop INTVECTOR nCells = FindCell( ptStart, clFirst) ; int nId ; @@ -2408,15 +2415,15 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) pCell->m_vInters.back().bCCW = bCCW ; // salvo il chunk del loop pCell->m_vInters.back().nChunk = m_mChunk[i] ; - // aggiorno la polyline splittata - UpdateSplitLoop( plLoopSplit, nPtLoopSplit, vptInters.back()) ; + // aggiorno la compo splittata + UpdateSplitLoop( pCCLoopSplit, vptInters.back()) ; } // controllo di aggiungere un punto abbastanza distante dal precedente if( ! AreSamePointXYEpsilon( vptInters.back(), ptCurr, 10 * EPS_SMALL)) { // aggiungo la fine del segmento nel vettore delle intersezioni vptInters.push_back( ptCurr) ; - // aggiorno la polyline splittata - UpdateSplitLoop( plLoopSplit, nPtLoopSplit, ptCurr) ; + // aggiorno la compo splittata + UpdateSplitLoop( pCCLoopSplit, ptCurr) ; } } if ( nId == nFirstCell) @@ -2466,8 +2473,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons) pCell->m_vInters[nPass].nOut = nOut ; } } - // salvo la polyline splittata - m_vPlLoop2D.emplace_back( plLoopSplit) ; + // salvo la compo splittata + m_vCCLoop2D.emplace_back( Release( pCCLoopSplit)) ; } // riordino i vettori di intersezione per ogni cella e setto il flag RightEdgeIn diff --git a/Tree.h b/Tree.h index f07240c..2b501be 100644 --- a/Tree.h +++ b/Tree.h @@ -262,10 +262,8 @@ class Tree bool GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells = {}) ; bool GetLeaves ( std::vector& vLeaves) const ; // restituisce gli indici delle foglie nell'albero bool GetEdges3D ( vector& mCCEdge) ; // restituisce gli edge 3D come polyline - bool GetSplitLoops( POLYLINEVECTOR& vPl) const // funzione che restituisce i loop splitatti ai confini delle celle - { for ( int i = 0 ; i < int( m_vPlLoop2D.size()); ++i) vPl.emplace_back( m_vPlLoop2D[i]) ; return true ; }; - // bool GetSplitLoops( ICRVCOMPOPOVECTOR& vCCLoopSplit) const // funzione che restituisce i loop splitatti ai confini delle celle - // { for ( int i = 0 ; i < int( m_vCCLoop2D.size()); ++i) vCCLoopSplit.emplace_back( m_vCCLoop2D[i]->Clone()) ; return true ; }; + bool GetSplitLoops( ICRVCOMPOPOVECTOR& vCCLoopSplit) const // funzione che restituisce i loop splitatti ai confini delle celle + { for ( int i = 0 ; i < int( m_vCCLoop2D.size()); ++i) vCCLoopSplit.emplace_back( m_vCCLoop2D[i]->Clone()) ; return true ; }; void SetTestMode( void) { m_bTestMode = true ;} ; // attivando la test mode, per la costruzione dell'albero viene usata la funzione BuiltTree_test e viene corretta di conseguenza la FindCell // funzioni da usare per ricostruire tagli che vanno aggiunti allo spazio parametrico bool AddCutsToRoot( POLYLINEVECTOR& vCuts) ; // aggiunge i tagli al tree @@ -308,8 +306,7 @@ class Tree bool CheckIfBetween( const Inters& inA, const Inters& inB) const ; // / controllo se inB è compreso tra l'end e lo start di inA (in senso CCW) bool OnWhichEdge( int nId, const Point3d& ptToAssign, int& nEdge) const ; // indica a quale edge o vertice il punto è vicino entro EPS_SMALL bool AdjustCuts( void) ; - bool UpdateSplitLoop( PolyLine& pl, int& nCount, Point3d& pt) ; - //bool UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) ; + bool UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) ; bool CloseOpenCuts( void) ; bool CloseOpenCuts( POLYLINEVECTOR& vPL, PolyLine& pl) const ; bool VerifyLoopOrientation( ICURVEPLIST& vpCrv, BOOLVECTOR& vbOrientation) const ; // verifico l'orientazione ( CCW o CW) delle polyline in base a come sono contenute le une nelle altre @@ -344,7 +341,6 @@ class Tree INTVECTOR m_vnLeaves ; // vettore delle foglie INTVECTOR m_vnParents ; // vettore delle celle ottenute dalla divisione preliminare in singole patch bool m_bTestMode ; // bool che indica se la test mode è attiva - POLYLINEVECTOR m_vPlLoop2D ; // vettore che contiene le polyline che rappresentano i loop di trim tenendo conto della divisione in celle - //ICRVCOMPOPOVECTOR m_vCCLoop2D ; // vettore che contiene le CurveCompo che rappresentano i loop di trim tenendo conto della divisione in celle + ICRVCOMPOPOVECTOR m_vCCLoop2D ; // vettore che contiene le CurveCompo che rappresentano i loop di trim tenendo conto della divisione in celle vector> m_vCEdge2D ; // vettore che le chain che rappresentano ciò che resta degli edge originali, tenendo conto dei trim. } ; \ No newline at end of file