EgtGeomKernel :
- correzione all'utlima modifica alla triangolazione delle bezier.
This commit is contained in:
@@ -1573,7 +1573,7 @@ Tree::GetPolygons( POLYLINEMATRIX& vPolygons)
|
||||
if ( ! m_bTrimmed) {
|
||||
vPolygons.clear() ;
|
||||
POLYLINEVECTOR vPolygonsBasic ;
|
||||
GetPolygonsBasic( vPolygonsBasic) ;
|
||||
GetPolygonsBasic( vPolygonsBasic, true) ;
|
||||
for ( PolyLine pl : vPolygonsBasic) {
|
||||
POLYLINEVECTOR vSinglePolygon ;
|
||||
vSinglePolygon.push_back( pl) ;
|
||||
@@ -1639,12 +1639,13 @@ Tree::GetPolygons( POLYLINEMATRIX& vPolygons)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells)
|
||||
Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, INTVECTOR vCells)
|
||||
{
|
||||
// condizioni per il calcolo dei poligoni di base
|
||||
if ( m_vPolygons.empty() || // se non li ho mai calcolati
|
||||
( ! m_vPolygons.empty() && ! vCells.empty()) || // se ho già calcolato dei poligoni ma ne sto chiedendo di un altro gruppo di celle
|
||||
( vCells.empty() && m_vPolygons.size() != m_vnLeaves.size())) { // se sto chiedendo i poligoni di tutte le celle, ma i poligoni già calcolati sono meno delle celle
|
||||
( vCells.empty() && m_vPolygons.size() != m_vnLeaves.size()) || // se sto chiedendo i poligoni di tutte le celle, ma i poligoni già calcolati sono meno delle celle
|
||||
bForTriangulation) { // oppure se sto chiedendo i poligoni per la triangolazione ( devo fare considerazioni particolari se ho dei poli sui lati del parametrico)
|
||||
m_vPolygons.clear() ;
|
||||
// se non ho dato un elenco di celle in input do per scontato che la chiamata sia per calcolare i poligoni di tutte le foglie
|
||||
if ( vCells.empty())
|
||||
@@ -1778,53 +1779,55 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells)
|
||||
vVertices.push_back( m_mTree.at( nId).GetBottomLeft()) ;
|
||||
vnVert.push_back( int(vVertices.size()) - 1) ;
|
||||
|
||||
// ora devo controllare se uno dei lati della cella è collassato in un punto.
|
||||
// se così, devo guardare se sui due lati adiacenti a quello di polo ho messo dei punti extra
|
||||
// se ne ho messi solo su uno dei due allora devo togliere il vertice dell'altro lato
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(0), m_mVert.at(nId).at(1)) && ( vbBonusVert[1] || vbBonusVert[3])) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if( ! ( vbBonusVert[1] && vbBonusVert[3])){
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if( vbBonusVert[1]) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase( vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[3]) {
|
||||
// dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto
|
||||
vVertices.pop_back() ;
|
||||
vVertices[0] = vVertices.end()[-1] ;
|
||||
if ( bForTriangulation){
|
||||
// ora devo controllare se uno dei lati della cella è collassato in un punto.
|
||||
// se così, devo guardare se sui due lati adiacenti a quello di polo ho messo dei punti extra
|
||||
// se ne ho messi solo su uno dei due allora devo togliere il vertice dell'altro lato
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(0), m_mVert.at(nId).at(1)) && ( vbBonusVert[1] || vbBonusVert[3] ) ) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if ( !( vbBonusVert[1] && vbBonusVert[3] ) ) {
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if ( vbBonusVert[1] ) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[3] ) {
|
||||
// dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto
|
||||
vVertices.pop_back() ;
|
||||
vVertices[0] = vVertices.end()[-1] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(1), m_mVert.at(nId).at(2)) && ( vbBonusVert[0] || vbBonusVert[2])) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if( ! ( vbBonusVert[0] && vbBonusVert[2])){
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if( vbBonusVert[0]) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase( vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[2])
|
||||
vVertices.erase( vVertices.begin() + vnVert[2]) ;
|
||||
}
|
||||
}
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(2), m_mVert.at(nId).at(3)) && ( vbBonusVert[1] || vbBonusVert[3])) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if( ! ( vbBonusVert[1] && vbBonusVert[3])){
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if( vbBonusVert[1]) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase( vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[3])
|
||||
vVertices.erase( vVertices.begin() + vnVert[3]) ;
|
||||
}
|
||||
}
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(3), m_mVert.at(nId).at(0)) && ( vbBonusVert[0] || vbBonusVert[2])) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if( ! ( vbBonusVert[0] && vbBonusVert[2])){
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if( vbBonusVert[0]){ // lati contati a partire da quello sopra in senso CCW
|
||||
// dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto
|
||||
vVertices.pop_back() ;
|
||||
vVertices[0] = vVertices.end()[-1] ;
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(1), m_mVert.at(nId).at(2)) && ( vbBonusVert[0] || vbBonusVert[2] ) ) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if ( !( vbBonusVert[0] && vbBonusVert[2] ) ) {
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if ( vbBonusVert[0] ) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[2] )
|
||||
vVertices.erase(vVertices.begin() + vnVert[2]) ;
|
||||
}
|
||||
}
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(2), m_mVert.at(nId).at(3)) && ( vbBonusVert[1] || vbBonusVert[3] ) ) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if ( !( vbBonusVert[1] && vbBonusVert[3] ) ) {
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if ( vbBonusVert[1] ) // lati contati a partire da quello sopra in senso CCW
|
||||
vVertices.erase(vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
else if ( vbBonusVert[3] )
|
||||
vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
}
|
||||
}
|
||||
if ( AreSamePointApprox(m_mVert.at(nId).at(3), m_mVert.at(nId).at(0)) && ( vbBonusVert[0] || vbBonusVert[2] ) ) {
|
||||
// se ho punti bonus su entrambi i lati non devo fare nulla
|
||||
if ( !( vbBonusVert[0] && vbBonusVert[2] ) ) {
|
||||
// sennò devo togliere l'estremo del lato su cui NON ho punti bonus
|
||||
if ( vbBonusVert[0] ) { // lati contati a partire da quello sopra in senso CCW
|
||||
// dovrei eliminare ptBL, quindi devo eliminare il primo e l'ultimo punto della polyline e poi chiuderla con quello che era il penultimo punto
|
||||
vVertices.pop_back() ;
|
||||
vVertices[0] = vVertices.end()[-1] ;
|
||||
}
|
||||
else if ( vbBonusVert[2] )
|
||||
vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
}
|
||||
else if ( vbBonusVert[2])
|
||||
vVertices.erase( vVertices.begin() + vnVert[3]) ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3896,13 +3899,13 @@ Tree::GetEdges3D( POLYLINEMATRIX& mPLEdges)
|
||||
// recupero i poligoni base delle celle sui bordi
|
||||
POLYLINEMATRIX mPL ;
|
||||
mPL.emplace_back() ;
|
||||
GetPolygonsBasic( mPL[0], vEdges[0]) ;
|
||||
GetPolygonsBasic( mPL[0], false, vEdges[0]) ;
|
||||
mPL.emplace_back() ;
|
||||
GetPolygonsBasic( mPL[1], vEdges[1]) ;
|
||||
GetPolygonsBasic( mPL[1], false, vEdges[1]) ;
|
||||
mPL.emplace_back() ;
|
||||
GetPolygonsBasic( mPL[2], vEdges[2]) ;
|
||||
GetPolygonsBasic( mPL[2], false, vEdges[2]) ;
|
||||
mPL.emplace_back() ;
|
||||
GetPolygonsBasic( mPL[3], vEdges[3]) ;
|
||||
GetPolygonsBasic( mPL[3], false, 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) {
|
||||
|
||||
Reference in New Issue
Block a user