- ulteriore riduzione di copie di costruzione e copie di polyline in tree.

This commit is contained in:
Daniele Bariletti
2025-03-24 12:42:56 +01:00
parent eb9aaef53a
commit b2e799e1d6
3 changed files with 30 additions and 57 deletions
+24 -17
View File
@@ -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<ICurveComposite> 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