EgtGeomKernel :
- correzione per evitare errori di triangolazione in prossimità dei poli in sup di Bezier.
This commit is contained in:
@@ -1611,6 +1611,10 @@ Tree::GetPolygons( POLYLINEMATRIX& vvPolygons, bool bForTriangulation, POLYLINEM
|
||||
else {
|
||||
POLYLINEVECTOR vPolygonsBasic ;
|
||||
GetPolygonsBasic( vPolygonsBasic) ;
|
||||
POLYLINEVECTOR vPolygons ;
|
||||
POLYLINEVECTOR vPolygonsBasic3d ;
|
||||
if ( bForTriangulation)
|
||||
GetPolygonsBasic( vPolygons, vPolygonsBasic3d) ;
|
||||
// aggiungo 4 elementi al vettore che contiene ciò che resta degli edge dopo il trim
|
||||
m_vCEdge2D.clear() ;
|
||||
for ( int i = 0 ; i < 4 ; ++i) {
|
||||
@@ -1620,11 +1624,6 @@ Tree::GetPolygons( POLYLINEMATRIX& vvPolygons, bool bForTriangulation, POLYLINEM
|
||||
// percorro i loop, trovo le intersezioni con le celle e le categorizzo
|
||||
if ( ! TraceLoopLabelCell( vPolygonsBasic))
|
||||
return false ;
|
||||
POLYLINEVECTOR vPolygonsBasic3d ;
|
||||
if ( bForTriangulation) {
|
||||
vPolygonsBasic.clear() ;
|
||||
GetPolygonsBasic( vPolygonsBasic, vPolygonsBasic3d) ;
|
||||
}
|
||||
// scorro sulle celle e costruisco i poligoni
|
||||
int nCells = int( vPolygonsBasic.size()) ;
|
||||
for ( int i = 0 ; i < nCells ; ++ i) {
|
||||
@@ -1858,6 +1857,9 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
vVertices3d.push_back( m_mVert[nId][0]) ;
|
||||
vnVert.push_back( int(vVertices.size()) - 1) ;
|
||||
|
||||
BOOLVECTOR vbKeepPoint( vVertices.size()) ;
|
||||
fill( vbKeepPoint.begin(), vbKeepPoint.end(), true) ;
|
||||
|
||||
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
|
||||
@@ -1867,15 +1869,20 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
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
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ;
|
||||
vbKeepPoint[vnVert[1]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 1 ; // ptBr
|
||||
}
|
||||
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] ;
|
||||
vVertices3d.pop_back() ;
|
||||
vVertices3d[0] = vVertices3d.end()[-1] ;
|
||||
//// 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] ;
|
||||
//vVertices3d.pop_back() ;
|
||||
//vVertices3d[0] = vVertices3d.end()[-1] ;
|
||||
vbKeepPoint[0] = false ;
|
||||
vbKeepPoint.back() = false ;
|
||||
m_mTree[nId].m_nVertToErase = 0 ; // ptBL
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1884,12 +1891,16 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
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
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[1]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[1]) ;
|
||||
vbKeepPoint[vnVert[1]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 1 ; // ptBr
|
||||
}
|
||||
else if ( vbBonusVert[2] ){
|
||||
vVertices.erase(vVertices.begin() + vnVert[2]) ;
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[2]) ;
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ;
|
||||
vbKeepPoint[vnVert[2]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 2 ; // ptTR
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1898,12 +1909,16 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
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
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[2]) ; // vertici della cella contati a partire da ptBL in senso CCW
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[2]) ;
|
||||
vbKeepPoint[vnVert[2]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 2 ; // ptTR
|
||||
}
|
||||
else if ( vbBonusVert[3] ) {
|
||||
vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ;
|
||||
vbKeepPoint[vnVert[3]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 3 ; // ptTl
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1912,15 +1927,20 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
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] ;
|
||||
vVertices3d.pop_back() ;
|
||||
vVertices3d[0] = vVertices3d.end()[-1] ;
|
||||
//// 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] ;
|
||||
//vVertices3d.pop_back() ;
|
||||
//vVertices3d[0] = vVertices3d.end()[-1] ;
|
||||
vbKeepPoint[0] = false ;
|
||||
vbKeepPoint.back() = false ;
|
||||
m_mTree[nId].m_nVertToErase = 0 ; // ptBL
|
||||
}
|
||||
else if ( vbBonusVert[2] ) {
|
||||
vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ;
|
||||
//vVertices.erase(vVertices.begin() + vnVert[3]) ;
|
||||
//vVertices3d.erase(vVertices3d.begin() + vnVert[3]) ;
|
||||
vbKeepPoint[vnVert[3]] = false ;
|
||||
m_mTree[nId].m_nVertToErase = 3 ; // ptTl
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1947,6 +1967,8 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
vVertices.back() = vVertices.at( 0) ;
|
||||
rotate( vVertices3d.begin(), vVertices3d.begin() + 1,vVertices3d.end()) ;
|
||||
vVertices3d.back() = vVertices3d.at( 0) ;
|
||||
rotate( vbKeepPoint.begin(), vbKeepPoint.begin() + 1,vbKeepPoint.end()) ;
|
||||
vbKeepPoint.back() = vbKeepPoint.at( 0) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1956,8 +1978,11 @@ Tree::GetPolygonsBasic( POLYLINEVECTOR& vPolygons, bool bForTriangulation, POLYL
|
||||
m_vPolygons3d.emplace_back() ;
|
||||
m_vPolygons3d.back().emplace_back() ;
|
||||
for ( int i = 0 ; i < (int) vVertices.size() ; ++i) {
|
||||
m_vPolygons.back().back().AddUPoint( i, vVertices.at( i)) ;
|
||||
m_vPolygons3d.back().back().AddUPoint( i, vVertices3d.at( i)) ;
|
||||
int dPar = i ;
|
||||
if( ! vbKeepPoint[i])
|
||||
dPar = -1 ;
|
||||
m_vPolygons.back().back().AddUPoint( dPar, vVertices.at( i)) ;
|
||||
m_vPolygons3d.back().back().AddUPoint( dPar, vVertices3d.at( i)) ;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2281,7 +2306,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
// trovo l'intersezione e passo alla cella successiva. nId viene aggiornato dalla funzione FindInters
|
||||
// se non trovo l'intersezione vuol dire che non sono nella cella giusta!
|
||||
// al precedente FindInters avrei dovuto passare di cella
|
||||
if ( ! FindInters( nId, clTrim, vptInters, true)) {
|
||||
if ( ! FindInters( nId, clTrim, vplPolygons[nIdPolygon], vptInters, true)) {
|
||||
// scarterò il punto molto vicino al lato e tengo solo l'intersezione del trim col lato
|
||||
if( vptInters.size() != 0)
|
||||
vptInters.pop_back() ;
|
||||
@@ -2291,7 +2316,7 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
clTrim.Set( ptTStart, ptTEnd) ;
|
||||
clTrim.ExtendEndByLen( EPS_SMALL * 2) ;
|
||||
clTrim.ExtendStartByLen( EPS_SMALL * 2) ;
|
||||
if ( ! FindInters( nId, clTrim, vptInters, true))
|
||||
if ( ! FindInters( nId, clTrim, vplPolygons[nIdPolygon], vptInters, true))
|
||||
return false ;
|
||||
bEraseNextPoint = true ;
|
||||
}
|
||||
@@ -2517,97 +2542,122 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Tree::FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool bFirstInters)
|
||||
Tree::FindInters( int& nId, const CurveLine& clTrim, const PolyLine& plPolygon, PNTVECTOR& vptInters, bool bFirstInters)
|
||||
{
|
||||
CurveLine clEdge , clEdge2 ;
|
||||
Point3d ptStart , ptEnd ;
|
||||
clTrim.GetStartPoint( ptStart) ;
|
||||
clTrim.GetEndPoint( ptEnd) ;
|
||||
// trovo da quale lato sto uscendo
|
||||
Point3d ptTR = m_mTree[nId].GetTopRight() ;
|
||||
Point3d ptBL = m_mTree[nId].GetBottomLeft() ;
|
||||
Point3d ptTl( ptBL.x , ptTR.y) ;
|
||||
Point3d ptBr( ptTR.x , ptBL.y) ;
|
||||
int nEdge ; // flag che indica il lato su cui ho l'intersezione a partire dal lato top in senso antiorario
|
||||
// oltre il 3 sono le celle adiacenti in diagonale al vertice-> 4 corrisponde al ptTl e da lì in senso antiorario
|
||||
// -1 se la curva è sempre dentro la cella
|
||||
Point3d ptInters ;
|
||||
//int nEdge2 ;
|
||||
if ( ptEnd.y >= ptTR.y && ptEnd.x <= ptTR.x) {
|
||||
//nEdge = 0 ;
|
||||
// lato sopra
|
||||
clEdge.Set( ptTR, ptTl) ;
|
||||
// lato sinistro
|
||||
if ( ptEnd.x < ptBL.x) {
|
||||
//nEdge2 = 1 ;
|
||||
clEdge2.Set( ptTl, ptBL) ;
|
||||
}
|
||||
}
|
||||
else if ( ptEnd.x <= ptBL.x && ptEnd.y <= ptTR.y) {
|
||||
nEdge = 1 ;
|
||||
// lato sinistro
|
||||
clEdge.Set( ptTl, ptBL) ;
|
||||
// lato sotto
|
||||
if ( ptEnd.y < ptBL.y) {
|
||||
//nEdge2 = 2 ;
|
||||
clEdge2.Set( ptBL, ptBr) ;
|
||||
}
|
||||
}
|
||||
else if ( ptEnd.y <= ptBL.y && ptEnd.x >= ptBL.x) {
|
||||
nEdge = 2 ;
|
||||
// lato sotto
|
||||
clEdge.Set( ptBL, ptBr) ;
|
||||
// lato destro
|
||||
if ( ptEnd.x > ptTR.x) {
|
||||
//nEdge2 = 3 ;
|
||||
clEdge2.Set( ptBr, ptTR) ;
|
||||
}
|
||||
}
|
||||
else if ( ptEnd.x >= ptTR.x && ptEnd.y >= ptBL.y) {
|
||||
nEdge = 3 ;
|
||||
// lato desto
|
||||
clEdge.Set( ptBr, ptTR) ;
|
||||
// lato sopra
|
||||
if ( ptEnd.y > ptTR.y) {
|
||||
//nEdge2 = 0 ;
|
||||
clEdge2.Set( ptTR, ptTl) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
|
||||
bool bIntersFound = false ;
|
||||
// intersezione e controlli
|
||||
IntersLineLine illExit( clTrim, clEdge, true) ;
|
||||
IntCrvCrvInfo aInfo, aInfo2 ;
|
||||
if ( ! illExit.GetIntCrvCrvInfo( aInfo)) {
|
||||
bIntersFound = false ;
|
||||
if ( ! clEdge2.IsValid())
|
||||
return false ;
|
||||
//CurveLine clEdge , clEdge2 ;
|
||||
//Point3d ptStart , ptEnd ;
|
||||
//clTrim.GetStartPoint( ptStart) ;
|
||||
//clTrim.GetEndPoint( ptEnd) ;
|
||||
//// trovo da quale lato sto uscendo
|
||||
////int nEdge ; // flag che indica il lato su cui ho l'intersezione a partire dal lato top in senso antiorario
|
||||
//// oltre il 3 sono le celle adiacenti in diagonale al vertice-> 4 corrisponde al ptTl e da lì in senso antiorario
|
||||
//// -1 se la curva è sempre dentro la cella
|
||||
////int nEdge2 ;
|
||||
//if ( ptEnd.y >= ptTR.y && ptEnd.x <= ptTR.x) {
|
||||
// //nEdge = 0 ;
|
||||
// // lato sopra
|
||||
// clEdge.Set( ptTR, ptTl) ;
|
||||
// // lato sinistro
|
||||
// if ( ptEnd.x < ptBL.x) {
|
||||
// //nEdge2 = 1 ;
|
||||
// clEdge2.Set( ptTl, ptBL) ;
|
||||
// }
|
||||
//}
|
||||
//else if ( ptEnd.x <= ptBL.x && ptEnd.y <= ptTR.y) {
|
||||
// nEdge = 1 ;
|
||||
// // lato sinistro
|
||||
// clEdge.Set( ptTl, ptBL) ;
|
||||
// // lato sotto
|
||||
// if ( ptEnd.y < ptBL.y) {
|
||||
// //nEdge2 = 2 ;
|
||||
// clEdge2.Set( ptBL, ptBr) ;
|
||||
// }
|
||||
//}
|
||||
//else if ( ptEnd.y <= ptBL.y && ptEnd.x >= ptBL.x) {
|
||||
// nEdge = 2 ;
|
||||
// // lato sotto
|
||||
// clEdge.Set( ptBL, ptBr) ;
|
||||
// // lato destro
|
||||
// if ( ptEnd.x > ptTR.x) {
|
||||
// //nEdge2 = 3 ;
|
||||
// clEdge2.Set( ptBr, ptTR) ;
|
||||
// }
|
||||
//}
|
||||
//else if ( ptEnd.x >= ptTR.x && ptEnd.y >= ptBL.y) {
|
||||
// nEdge = 3 ;
|
||||
// // lato desto
|
||||
// clEdge.Set( ptBr, ptTR) ;
|
||||
// // lato sopra
|
||||
// if ( ptEnd.y > ptTR.y) {
|
||||
// //nEdge2 = 0 ;
|
||||
// clEdge2.Set( ptTR, ptTl) ;
|
||||
// }
|
||||
//}
|
||||
//else
|
||||
// return false ;
|
||||
|
||||
//bool bIntersFound = false ;
|
||||
//// intersezione e controlli
|
||||
//IntersLineLine illExit( clTrim, clEdge, true) ;
|
||||
//IntCrvCrvInfo aInfo, aInfo2 ;
|
||||
//if ( ! illExit.GetIntCrvCrvInfo( aInfo)) {
|
||||
// bIntersFound = false ;
|
||||
// if ( ! clEdge2.IsValid())
|
||||
// return false ;
|
||||
//}
|
||||
//else {
|
||||
// bIntersFound = true ;
|
||||
// if ( aInfo.bOverlap)
|
||||
// ptInters = aInfo.IciA[1].ptI ;
|
||||
// else
|
||||
// ptInters = aInfo.IciA[0].ptI ;
|
||||
//}
|
||||
//if ( clEdge2.IsValid() && ! bIntersFound){
|
||||
// IntersLineLine illExit2( clTrim, clEdge2, true) ;
|
||||
// // verifico su quale dei due lati ho l'intersezione
|
||||
// if ( ! illExit2.GetIntCrvCrvInfo( aInfo2))
|
||||
// bIntersFound = false ;
|
||||
// else {
|
||||
// bIntersFound = true ;
|
||||
// //// solo intersezione sul lato 2
|
||||
// if ( aInfo2.bOverlap)
|
||||
// ptInters = aInfo2.IciA[1].ptI ;
|
||||
// else
|
||||
// ptInters = aInfo2.IciA[0].ptI ;
|
||||
// }
|
||||
//}
|
||||
//if ( ! bIntersFound)
|
||||
// return false ;
|
||||
|
||||
PtrOwner<ICurveComposite> pCC( CreateCurveComposite()) ;
|
||||
PolyLine plSimplePolygon ;
|
||||
plSimplePolygon = plPolygon ;
|
||||
plSimplePolygon.RemoveAlignedPoints() ;
|
||||
pCC->FromPolyLine( plSimplePolygon) ;
|
||||
IntersCurveCurve icc( clTrim, *pCC) ;
|
||||
IntCrvCrvInfo iccInfo ;
|
||||
if ( icc.GetOverlaps()) {
|
||||
for ( int i = 0 ; i < icc.GetIntersCount() ; ++i) {
|
||||
icc.GetIntCrvCrvInfo( i, iccInfo) ;
|
||||
if( iccInfo.bOverlap){
|
||||
ptInters = iccInfo.IciA[1].ptI ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
bIntersFound = true ;
|
||||
if ( aInfo.bOverlap)
|
||||
ptInters = aInfo.IciA[1].ptI ;
|
||||
else
|
||||
ptInters = aInfo.IciA[0].ptI ;
|
||||
int nLastInters = icc.GetIntersCount() -1 ;
|
||||
icc.GetIntCrvCrvInfo( nLastInters, iccInfo) ;
|
||||
ptInters = iccInfo.IciA[0].ptI ;
|
||||
}
|
||||
if ( clEdge2.IsValid() && ! bIntersFound){
|
||||
IntersLineLine illExit2( clTrim, clEdge2, true) ;
|
||||
// verifico su quale dei due lati ho l'intersezione
|
||||
if ( ! illExit2.GetIntCrvCrvInfo( aInfo2))
|
||||
bIntersFound = false ;
|
||||
else {
|
||||
bIntersFound = true ;
|
||||
//// solo intersezione sul lato 2
|
||||
if ( aInfo2.bOverlap)
|
||||
ptInters = aInfo2.IciA[1].ptI ;
|
||||
else
|
||||
ptInters = aInfo2.IciA[0].ptI ;
|
||||
}
|
||||
}
|
||||
if ( ! bIntersFound)
|
||||
return false ;
|
||||
|
||||
// determino il lato/vertice di uscita
|
||||
OnWhichEdge( nId, ptInters, nEdge) ;
|
||||
m_mTree[nId].m_vInters.back().nOut = nEdge ;
|
||||
@@ -2945,24 +2995,41 @@ Tree::FindInters( int& nId, const CurveLine& clTrim, PNTVECTOR& vptInters, bool
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vPolygons3d, INTVECTOR& vToCheck, int& nPoly, INTVECTOR& vnParentChunk, const PolyLine& plCell, const PolyLine& plCell3d)
|
||||
Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX& vPolygons3d, INTVECTOR& vToCheck, int& nPoly, INTVECTOR& vnParentChunk,
|
||||
const PolyLine& plCell, const PolyLine& plCell3d)
|
||||
{
|
||||
// conto quanti vertici in più ho per lato e creo un vettore dei vertici per lato
|
||||
int nId = m_vnLeaves[nLeafId] ;
|
||||
PNTMATRIX vEdgeVertex(4) ;
|
||||
PNTMATRIX vEdgeVertex3d(4) ;
|
||||
vEdgeVertex[0].push_back( m_mTree[nId].GetTopRight()) ;
|
||||
vEdgeVertex[1].push_back( m_mTree[nId].GetTopLeft()) ;
|
||||
vEdgeVertex[2].push_back( m_mTree[nId].GetBottomLeft()) ;
|
||||
vEdgeVertex[3].push_back( m_mTree[nId].GetBottomRight()) ;
|
||||
Point3d ptBL = m_mTree[nId].GetBottomLeft() ;
|
||||
Point3d ptTR = m_mTree[nId].GetTopRight() ;
|
||||
Point3d ptTl = m_mTree[nId].GetTopLeft() ;
|
||||
Point3d ptBr = m_mTree[nId].GetBottomRight() ;
|
||||
int nVertToErase = m_mTree.at(nId).m_nVertToErase ;
|
||||
if( nVertToErase != 2)
|
||||
vEdgeVertex[0].push_back( ptTR) ;
|
||||
if( nVertToErase != 3)
|
||||
vEdgeVertex[1].push_back( ptTl) ;
|
||||
if( nVertToErase != 0)
|
||||
vEdgeVertex[2].push_back( ptBL) ;
|
||||
if( nVertToErase != 1)
|
||||
vEdgeVertex[3].push_back( ptBr) ;
|
||||
// capisco se sono in modalità ForTriangulation
|
||||
bool bForTriangulation = plCell3d.GetPointNbr() != 0 ;
|
||||
if ( bForTriangulation) {
|
||||
vEdgeVertex3d[0].push_back( m_mVert[nId][2]) ;
|
||||
vEdgeVertex3d[1].push_back( m_mVert[nId][3]) ;
|
||||
vEdgeVertex3d[2].push_back( m_mVert[nId][0]) ;
|
||||
vEdgeVertex3d[3].push_back( m_mVert[nId][1]) ;
|
||||
if( nVertToErase != 2)
|
||||
vEdgeVertex3d[0].push_back( m_mVert[nId][2]) ;
|
||||
if( nVertToErase != 3)
|
||||
vEdgeVertex3d[1].push_back( m_mVert[nId][3]) ;
|
||||
if( nVertToErase != 0)
|
||||
vEdgeVertex3d[2].push_back( m_mVert[nId][0]) ;
|
||||
if( nVertToErase != 1)
|
||||
vEdgeVertex3d[3].push_back( m_mVert[nId][1]) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// la PolyLine è riempita a partire dal lato bottom
|
||||
Point3d ptStart, pt3d ;
|
||||
plCell.GetFirstPoint( ptStart) ;
|
||||
@@ -2975,7 +3042,14 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX
|
||||
if ( j == 3)
|
||||
next = 0 ;
|
||||
Point3d ptToAdd ;
|
||||
while ( plCell.GetNextPoint( ptToAdd) && ! AreSamePointExact( ptToAdd, vEdgeVertex[next][0])) {
|
||||
Point3d ptNextVert ;
|
||||
switch ( next ) {
|
||||
case 0 : ptNextVert = ptTR ; break ;
|
||||
case 1 : ptNextVert = ptTl; break ;
|
||||
case 2 : ptNextVert = ptBL ; break ;
|
||||
case 3 : ptNextVert = ptBr ; break ;
|
||||
}
|
||||
while ( plCell.GetNextPoint( ptToAdd) && ! AreSamePointExact( ptToAdd, ptNextVert)) {
|
||||
vEdgeVertex[j].push_back( ptToAdd) ;
|
||||
if ( bForTriangulation) {
|
||||
plCell3d.GetNextPoint( pt3d) ;
|
||||
@@ -3101,13 +3175,13 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX
|
||||
while ( ! ( bValidNextStart && bAtNextStart) && bNotCameBack) {
|
||||
Point3d ptVert ;
|
||||
if ( nEdge == 0)
|
||||
ptVert = vEdgeVertex[1][0] ;
|
||||
ptVert = ptTl ;
|
||||
else if ( nEdge == 1)
|
||||
ptVert = vEdgeVertex[2][0] ;
|
||||
ptVert = ptBL ;
|
||||
else if ( nEdge == 2)
|
||||
ptVert = vEdgeVertex[3][0] ;
|
||||
ptVert = ptBr ;
|
||||
else if ( nEdge == 3)
|
||||
ptVert = vEdgeVertex[0][0] ;
|
||||
ptVert = ptTR ;
|
||||
AddVertex( nId, vEdgeVertex, vEdgeVertex3d, plTrimmedPoly, c, ptVert, plTrimmedPoly3d) ;
|
||||
if ( nEdge > 3 && nEdge != 7)
|
||||
nEdge = nEdge - 4 ;
|
||||
@@ -3155,13 +3229,13 @@ Tree::CreateCellPolygons( int nLeafId, POLYLINEMATRIX& vPolygons, POLYLINEMATRIX
|
||||
while ( bNotCameBack) {
|
||||
Point3d ptVert ;
|
||||
if ( nEdge == 0)
|
||||
ptVert = vEdgeVertex[1][0] ;
|
||||
ptVert = ptTl ;
|
||||
else if ( nEdge == 1)
|
||||
ptVert = vEdgeVertex[2][0] ;
|
||||
ptVert = ptBL ;
|
||||
else if ( nEdge == 2)
|
||||
ptVert = vEdgeVertex[3][0] ;
|
||||
ptVert = ptBr ;
|
||||
else if ( nEdge == 3)
|
||||
ptVert = vEdgeVertex[0][0] ;
|
||||
ptVert = ptTR ;
|
||||
AddVertex( nId, vEdgeVertex, vEdgeVertex3d, plTrimmedPoly, c, ptVert, plTrimmedPoly3d) ;
|
||||
if ( nEdge > 3 && nEdge != 7)
|
||||
nEdge = nEdge - 4 ;
|
||||
@@ -3521,10 +3595,10 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe
|
||||
++ c ;
|
||||
return true ;
|
||||
}
|
||||
Point3d ptBr = vEdgeVertex[3][0] ;
|
||||
Point3d ptTR = vEdgeVertex[0][0] ;
|
||||
Point3d ptTl = vEdgeVertex[1][0] ;
|
||||
Point3d ptBL = vEdgeVertex[2][0] ;
|
||||
Point3d ptBr = m_mTree.at(nId).GetBottomRight() ;
|
||||
Point3d ptTR = m_mTree.at(nId).GetTopRight() ;
|
||||
Point3d ptTl = m_mTree.at(nId).GetTopLeft() ;
|
||||
Point3d ptBL = m_mTree.at(nId).GetBottomLeft() ;
|
||||
Point3d ptLast ;
|
||||
plTrimmedPoly.GetLastPoint( ptLast) ;
|
||||
// verifico di essere allineato con un lato, sennò aggiungo e basta
|
||||
@@ -3584,7 +3658,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe
|
||||
plTrimmedPoly.AddUPoint( c, ptToAdd) ;
|
||||
if( bForTriangulation){
|
||||
Point3d pt3d ;
|
||||
if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[1][0]))
|
||||
if( ! AreSamePointApprox(ptToAdd, ptTl))
|
||||
m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ;
|
||||
else
|
||||
pt3d = vEdgeVertex3d[1][0] ;
|
||||
@@ -3606,7 +3680,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe
|
||||
plTrimmedPoly.AddUPoint( c, ptToAdd) ;
|
||||
if( bForTriangulation) {
|
||||
Point3d pt3d ;
|
||||
if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[2][0]))
|
||||
if( ! AreSamePointApprox(ptToAdd, ptBL))
|
||||
m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ;
|
||||
else
|
||||
pt3d = vEdgeVertex3d[2][0] ;
|
||||
@@ -3628,7 +3702,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe
|
||||
plTrimmedPoly.AddUPoint( c, ptToAdd) ;
|
||||
if( bForTriangulation){
|
||||
Point3d pt3d ;
|
||||
if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[3][0]))
|
||||
if( ! AreSamePointApprox(ptToAdd, ptBr))
|
||||
m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ;
|
||||
else
|
||||
pt3d = vEdgeVertex3d[3][0] ;
|
||||
@@ -3650,7 +3724,7 @@ Tree::AddVertex( int nId, const PNTMATRIX& vEdgeVertex, const PNTMATRIX& vEdgeVe
|
||||
plTrimmedPoly.AddUPoint( c, ptToAdd) ;
|
||||
if( bForTriangulation) {
|
||||
Point3d pt3d ;
|
||||
if( ! AreSamePointApprox(ptToAdd, vEdgeVertex[0][0]))
|
||||
if( ! AreSamePointApprox(ptToAdd, ptTR))
|
||||
m_pSrfBz->GetPointD1D2( ptToAdd.x / SBZ_TREG_COEFF, ptToAdd.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, pt3d) ;
|
||||
else
|
||||
pt3d = vEdgeVertex3d[0][0] ;
|
||||
|
||||
Reference in New Issue
Block a user