EgtGeomKernel :

- correzione per evitare errori di triangolazione in prossimità dei poli in sup di Bezier.
This commit is contained in:
Daniele Bariletti
2024-07-12 12:04:41 +02:00
parent f7a28447fb
commit 695350d3f6
2 changed files with 216 additions and 141 deletions
+211 -137
View File
@@ -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] ;