- riduzione del numero di copie di polyline nel tree di una bezier.

This commit is contained in:
Daniele Bariletti
2025-03-24 10:09:39 +01:00
parent 0b9c9f375c
commit eb9aaef53a
3 changed files with 86 additions and 76 deletions
+53 -59
View File
@@ -2075,6 +2075,7 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygonsBasic, POLYLINEVECTOR& vPolygon
}
}
cell.AddPoly( m_vPolygons.size()) ;
m_vPolygons.emplace_back() ;
m_vPolygons.back().emplace_back() ;
m_vPolygonsCorr.emplace_back() ;
@@ -4288,7 +4289,7 @@ Tree::OnWhichEdge( int nId, const Point3d& ptToAssign, int& nEdge) const
//----------------------------------------------------------------------------
bool
Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges)
Tree::GetEdges3D( vector<ICRVCOMPOPOVECTOR>& mCCEdges)
{
// se la superficie non è trimmata ricostruisco dalle celle al bordo
if ( ! m_bTrimmed) {
@@ -4308,97 +4309,90 @@ Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges)
GetRootNeigh( 3, vEdges[3]) ;
// recupero i poligoni base delle celle sui bordi
POLYLINEMATRIX mPL ;
mPL.emplace_back() ;
GetPolygonsBasic( mPL[0], vEdges[0]) ;
mPL.emplace_back() ;
GetPolygonsBasic( mPL[1], vEdges[1]) ;
mPL.emplace_back() ;
GetPolygonsBasic( mPL[2], vEdges[2]) ;
mPL.emplace_back() ;
GetPolygonsBasic( mPL[3], vEdges[3]) ;
//POLYLINEMATRIX mPL ;
//mPL.emplace_back() ;
//GetPolygonsBasic( mPL[0], vEdges[0]) ;
//mPL.emplace_back() ;
//GetPolygonsBasic( mPL[1], vEdges[1]) ;
//mPL.emplace_back() ;
//GetPolygonsBasic( mPL[2], vEdges[2]) ;
//mPL.emplace_back() ;
//GetPolygonsBasic( mPL[3], vEdges[3]) ;
// scorro sui gruppi di polyline che rappresentano i poligoni delle celle lungo un lato
for ( int i = 0 ; i < int( mPL.size()) ; ++i) {
mPLEdges.emplace_back() ;
mPLEdges.back().emplace_back() ;
int nPtCount = 0 ;
for ( int i = 0 ; i < int( vEdges.size()) ; ++i) {
mCCEdges.emplace_back() ;
mCCEdges.back().emplace_back(CreateBasicCurveComposite()) ;
// scorro sui poligoni delle celle di un lato
for ( int c = 0 ; c < int( mPL[i].size()) ; ++c) {
Point3d pt ; mPL[i][c].GetFirstPoint( pt) ;
for ( int c = 0 ; c < int( vEdges[i].size()) ; ++c) {
Cell& cNeigh = m_mTree.at(vEdges[i][c]) ;
PolyLine& plCell = m_vPolygons[cNeigh.m_vnPolyId[0]][0] ;
Point3d pt ; plCell.GetFirstPoint( pt) ;
Point3d pt3d ;
// a seconda del lato controllo di stare scorrendo il poligono prendendo solo i punti su quel lato
if ( i == 0) {
while ( ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[0][c]).GetTopRight()) && mPL[i][c].GetNextPoint( pt)) {
while ( ! AreSamePointXYApprox(pt, cNeigh.GetTopRight()) && plCell.GetNextPoint(pt) ) {
continue ;
}
Cell& cNeigh = m_mTree.at(vEdges[0][c]) ;
Point3d pt3d ; GetPoint( cNeigh.GetTopRight().x, cNeigh.GetTopRight().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddPoint( pt3d) ;
// scorro fino alla fine di quel lato
while ( mPL[i][c].GetNextPoint( pt) && ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[0][c]).GetTopLeft())) {
while ( plCell.GetNextPoint( pt) && ! AreSamePointXYApprox(pt, cNeigh.GetTopLeft())) {
GetPoint( pt.x, pt.y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
}
pt3d = ORIG ; GetPoint( cNeigh.GetBottomLeft().x, cNeigh.GetTopRight().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
if ( ! mCCEdges.back().back()->IsValid())
mCCEdges.back().back()->FromPoint( pt3d) ;
}
else if ( i == 1 ) {
while ( ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[1][c]).GetTopLeft()) && mPL[i][c].GetNextPoint( pt)) {
while ( ! AreSamePointXYApprox(pt, cNeigh.GetTopLeft()) && plCell.GetNextPoint( pt)) {
continue ;
}
Cell& cNeigh = m_mTree.at(vEdges[1][c]) ;
Point3d pt3d ; GetPoint( cNeigh.GetBottomLeft().x, cNeigh.GetTopRight().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddPoint( pt3d) ;
// scorro fino alla fine di quel lato
while ( mPL[i][c].GetNextPoint( pt) && ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[1][c]).GetBottomLeft())) {
while ( plCell.GetNextPoint( pt) && ! AreSamePointXYApprox(pt, cNeigh.GetBottomLeft())) {
GetPoint( pt.x, pt.y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
}
pt3d = ORIG ; GetPoint( cNeigh.GetBottomLeft().x, cNeigh.GetBottomLeft().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
if ( ! mCCEdges.back().back()->IsValid())
mCCEdges.back().back()->FromPoint( pt3d) ;
}
else if ( i == 2) {
while ( ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[2][c]).GetBottomLeft()) && mPL[i][c].GetNextPoint( pt)) {
while ( ! AreSamePointXYApprox(pt, cNeigh.GetBottomLeft()) && plCell.GetNextPoint( pt)) {
continue ;
}
Cell& cNeigh = m_mTree.at(vEdges[2][c]) ;
Point3d pt3d ; GetPoint( cNeigh.GetBottomLeft().x, cNeigh.GetBottomLeft().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddPoint( pt3d) ;
// scorro fino alla fine di quel lato
while ( mPL[i][c].GetNextPoint( pt) && ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[2][c]).GetBottomRight())) {
while ( plCell.GetNextPoint( pt) && ! AreSamePointXYApprox(pt, cNeigh.GetBottomRight())) {
GetPoint( pt.x, pt.y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
}
pt3d = ORIG ; GetPoint( cNeigh.GetTopRight().x, cNeigh.GetBottomLeft().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
if ( ! mCCEdges.back().back()->IsValid())
mCCEdges.back().back()->FromPoint( pt3d) ;
}
else if ( i == 3) {
while ( ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[3][c]).GetBottomRight()) && mPL[i][c].GetNextPoint( pt)) {
while ( ! AreSamePointXYApprox(pt, cNeigh.GetBottomRight()) && plCell.GetNextPoint( pt)) {
continue ;
}
Cell& cNeigh = m_mTree.at(vEdges[3][c]) ;
Point3d pt3d ; GetPoint( cNeigh.GetTopRight().x, cNeigh.GetBottomLeft().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddPoint( pt3d) ;
// scorro fino alla fine di quel lato
while ( mPL[i][c].GetNextPoint( pt) && ! AreSamePointXYApprox(pt, m_mTree.at(vEdges[3][c]).GetTopRight())) {
while ( plCell.GetNextPoint( pt) && ! AreSamePointXYApprox(pt, cNeigh.GetTopRight())) {
GetPoint( pt.x, pt.y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
}
pt3d = ORIG ; GetPoint( cNeigh.GetTopRight().x, cNeigh.GetTopRight().y, pt3d) ;
mPLEdges.back().back().AddUPoint( nPtCount, pt3d) ;
++ nPtCount ;
mCCEdges.back().back()->AddLine( pt3d) ;
if ( ! mCCEdges.back().back()->IsValid())
mCCEdges.back().back()->FromPoint( pt3d) ;
}
}
}
@@ -4407,25 +4401,25 @@ Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges)
else {
// per ogni edge creo le compo che compongono l'edge dopo i trim ( possono essere più compo separate tra loro)
for ( int i = 0 ; i < 4 ; ++i) {
mPLEdges.emplace_back() ;
mCCEdges.emplace_back() ;
INTVECTOR vId ;
Point3d ptNear = m_mTree.at(-1).GetBottomLeft() ;
while( m_vCEdge2D[i].second.GetChainFromNear(ptNear, false, vId) ) {
PolyLine pl3D ;
PtrOwner<ICurveComposite> pCC3D( CreateCurveComposite()) ;
int nInd = abs( vId[0]) - 1 ;
Point3d pt2D = m_vCEdge2D[i].first[nInd].first ;
Point3d pt3D ; GetPoint( pt2D.x, pt2D.y, pt3D) ;
pl3D.AddUPoint( 0, pt3D) ;
int nCount = 1 ;
pCC3D->AddPoint( pt3D) ;
for ( int j = 1 ; j < int( vId.size()) ; ++j) {
nInd = abs( vId[j]) - 1 ;
pt2D = m_vCEdge2D[i].first[nInd].second ;
GetPoint( pt2D.x, pt2D.y, pt3D) ;
if ( pl3D.AddUPoint( nCount, pt3D))
++ nCount ;
pCC3D->AddLine( pt3D) ;
}
if ( ! pCC3D->IsValid())
pCC3D->FromPoint( pt3D) ;
// qui devo fare dei controlli prima di aggiungere questa polyline?
mPLEdges[i].emplace_back( pl3D) ;
mCCEdges[i].emplace_back( Release(pCC3D)) ;
}
}
}