- riduzione del numero di copie di polyline nel tree di una bezier.
This commit is contained in:
@@ -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)) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user