- ulteriore riduzione di copie di costruzione e copie di polyline in tree.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user