EgtGeomKernel :

- aggiunto Set di Arc con punti estremi, vtN e bulge
- contenuto numero decimali in Dump
- corretto Set di Frame3d basato su OCS
- migliorati controlli su indici di Stm
- controllo su AddTriangle di Stm per vertici coincidenti.
This commit is contained in:
Dario Sassi
2014-04-21 21:57:02 +00:00
parent ef6300a3bc
commit 7e680c311f
10 changed files with 226 additions and 78 deletions
+64 -57
View File
@@ -71,7 +71,7 @@ SurfTriMesh::AddVertex( const Point3d& ptVert)
m_OGrMgr.Reset() ;
// inserisco il vertice
try { m_vVert.push_back( StmVert( ptVert)) ;}
catch(...) { return VT_NULL ;}
catch(...) { return SVT_NULL ;}
// ne determino l'indice
return int( m_vVert.size() - 1) ;
}
@@ -94,7 +94,7 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
catch (...) { return false ; }
// inizializzo a cancellati gli eventuali vertici intermedi
if ( ( nNewSize - nPrevSize) > 1) {
StmVert vEmpty( Point3d(), VT_DEL, 0) ;
StmVert vEmpty( Point3d(), SVT_DEL, 0) ;
for ( int i = nPrevSize ; i < nNewSize ; ++ i)
m_vVert[i] = vEmpty ;
}
@@ -108,12 +108,17 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
int
SurfTriMesh::AddTriangle( const int nIdVert[3])
{
// verifico che i tre indici diano diversi
if ( nIdVert[0] == nIdVert[1] ||
nIdVert[1] == nIdVert[2] ||
nIdVert[2] == nIdVert[0])
return SVT_DEL ;
// imposto ricalcolo
m_nStatus = TO_VERIFY ;
m_OGrMgr.Reset() ;
// inserisco il triangolo
try { m_vTria.push_back( StmTria( nIdVert)) ;}
catch(...) { return VT_NULL ;}
catch(...) { return SVT_NULL ;}
// ne determino l'indice
return int( m_vTria.size() - 1) ;
}
@@ -137,7 +142,7 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT)
// inizializzo a cancellati gli eventuali triangoli intermedi
if ( ( nNewSize - nPrevSize) > 1) {
StmTria tEmpty ;
tEmpty.nIdVert[0] = VT_DEL ;
tEmpty.nIdVert[0] = SVT_DEL ;
for ( int i = nPrevSize ; i < nNewSize ; ++ i)
m_vTria[i] = tEmpty ;
}
@@ -151,7 +156,7 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT)
int
SurfTriMesh::GetFirstVertex( Point3d& ptP) const
{
return GetNextVertex( VT_NULL, ptP) ;
return GetNextVertex( SVT_NULL, ptP) ;
}
//----------------------------------------------------------------------------
@@ -161,10 +166,10 @@ SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
// cerco il primo successivo valido
do {
nId ++ ;
} while ( nId < GetVertexNum() && m_vVert[nId].nIdTria == VT_DEL) ;
} while ( nId < GetVertexNum() && m_vVert[nId].nIdTria == SVT_DEL) ;
// se oltrepassata fine
if ( nId >= GetVertexNum())
return VT_NULL ;
return SVT_NULL ;
// recupero i dati
ptP = m_vVert[nId].ptP ;
// ritorno indice triangolo corrente
@@ -175,7 +180,7 @@ SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
int
SurfTriMesh::GetFirstTriangle( Triangle3d& Tria) const
{
return GetNextTriangle( VT_NULL, Tria) ;
return GetNextTriangle( SVT_NULL, Tria) ;
}
//----------------------------------------------------------------------------
@@ -185,10 +190,10 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
// cerco il primo successivo valido
do {
nId ++ ;
} while ( nId < GetTriangleNum() && m_vTria[nId].nIdVert[0] == VT_DEL) ;
} while ( nId < GetTriangleNum() && m_vTria[nId].nIdVert[0] == SVT_DEL) ;
// se oltrepassata fine
if ( nId >= GetTriangleNum())
return VT_NULL ;
return SVT_NULL ;
// recupero i dati
Tria.Set( m_vVert[m_vTria[nId].nIdVert[0]].ptP,
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
@@ -203,7 +208,7 @@ bool
SurfTriMesh::GetTriangleSmoothNormals( int nId, TriNormals3d& TNrms) const
{
// verifico esistenza del triangolo
if ( nId >= GetTriangleNum() || m_vTria[nId].nIdVert[0] == VT_DEL)
if ( nId >= GetTriangleNum() || m_vTria[nId].nIdVert[0] == SVT_DEL)
return false ;
// recupero le normali di ciascun vertice
@@ -321,9 +326,9 @@ SurfTriMesh::Dump( string& sOut, const char* szNewLine) const
// se superficie aperta o chiusa
sOut += ( m_bClosed ? "Closed" : "Open") ;
// numero di vertici
sOut += " NbrVert=" + ToString( GetVertexNum()) ;
sOut += " VertNbr=" + ToString( GetVertexNum()) ;
// numero di triangoli
sOut += " NbrTria=" + ToString( GetTriangleNum()) ;
sOut += " TriaNbr=" + ToString( GetTriangleNum()) ;
return true ;
}
@@ -438,10 +443,11 @@ SurfTriMesh::Validate( void)
m_nStatus = OK ;
for ( int i = 0 ; i < GetTriangleNum() && m_nStatus == OK ; ++ i) {
// se triangolo non cancellato
if ( m_vTria[i].nIdVert[0] != VT_DEL) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
for ( int j = 0 ; j < 3 && m_nStatus == OK ; ++ j) {
if ( m_vTria[i].nIdVert[j] >= GetVertexNum() ||
m_vVert[ m_vTria[i].nIdVert[j]].nIdTria == VT_DEL)
if ( m_vTria[i].nIdVert[j] < 0 ||
m_vTria[i].nIdVert[j] >= GetVertexNum() ||
m_vVert[ m_vTria[i].nIdVert[j]].nIdTria == SVT_DEL)
m_nStatus = ERR ;
}
// calcolo eventuali normale mancante
@@ -453,9 +459,10 @@ SurfTriMesh::Validate( void)
// Verifico che i triangoli riferiti dai vertici esistano
for ( int i = 0 ; i < GetVertexNum() && m_nStatus == OK ; ++ i) {
// se vertice non cancellato e con riferimento assegnato
if ( m_vVert[i].nIdTria != VT_DEL && m_vVert[i].nIdTria != VT_NULL) {
if ( m_vVert[i].nIdTria >= GetTriangleNum() ||
m_vTria[ m_vVert[i].nIdTria].nIdVert[0] == VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL && m_vVert[i].nIdTria != SVT_NULL) {
if ( m_vVert[i].nIdTria < SVT_DEL ||
m_vVert[i].nIdTria >= GetTriangleNum() ||
m_vTria[ m_vVert[i].nIdTria].nIdVert[0] == SVT_DEL)
m_nStatus = ERR ;
}
}
@@ -488,7 +495,7 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT) const
// recupero il triangolo puntato dal vertice
int nT = m_vVert[nV].nIdTria ;
if ( nT == VT_NULL)
if ( nT == SVT_NULL)
return 0 ;
vT.push_back( nT) ;
@@ -499,14 +506,14 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT) const
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[Prev(k)] ;
else
nTa = VT_NULL ;
nTa = SVT_NULL ;
// per evitare cicli infiniti dovuti a triangoli invertiti
if ( vT.size() >= 2 && nTa == vT[vT.size()-2])
break ;
// se valido
if ( nTa != nT && nTa != VT_NULL)
if ( nTa != nT && nTa != SVT_NULL)
vT.push_back( nTa) ;
} while ( nTa != nT && nTa != VT_NULL && vT.size() < MAX_VT_SIZE) ;
} while ( nTa != nT && nTa != SVT_NULL && vT.size() < MAX_VT_SIZE) ;
// se sono ritornato al triangolo di partenza ho fatto un giro e concluso la ricerca
if ( nTa == nT)
@@ -518,14 +525,14 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT) const
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[k] ;
else
nTa = VT_NULL ;
nTa = SVT_NULL ;
// per evitare cicli infiniti dovuti a triangoli invertiti
if ( vT.size() >= 2 && nTa == vT[vT.size()-2])
break ;
// se valido
if ( nTa != nT && nTa != VT_NULL)
if ( nTa != nT && nTa != SVT_NULL)
vT.insert( vT.begin(), nTa) ;
} while ( nTa != nT && nTa != VT_NULL && vT.size() < MAX_VT_SIZE) ;
} while ( nTa != nT && nTa != SVT_NULL && vT.size() < MAX_VT_SIZE) ;
return int( vT.size()) ;
}
@@ -537,9 +544,9 @@ SurfTriMesh::AdjustAdjacencies( void)
// sistemo i puntatori dai vertici ai triangoli
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
// se triangolo non cancellato
if ( m_vTria[i].nIdVert[0] != VT_DEL) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
for ( int j = 0 ; j < 3 ; ++ j) {
if ( m_vVert[ m_vTria[i].nIdVert[j]].nIdTria == VT_NULL)
if ( m_vVert[ m_vTria[i].nIdVert[j]].nIdTria == SVT_NULL)
m_vVert[ m_vTria[i].nIdVert[j]].nIdTria = i ;
}
}
@@ -551,10 +558,10 @@ SurfTriMesh::AdjustAdjacencies( void)
bModif = false ;
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
// se triangolo non cancellato
if ( m_vTria[i].nIdVert[0] != VT_DEL) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
for ( int j = 0 ; j < 3 ; ++ j) {
// se adiacenza non risolta
if ( m_vTria[i].nIdAdjac[j] == VT_NULL) {
if ( m_vTria[i].nIdAdjac[j] == SVT_NULL) {
// vertici all'estremo dello half-edge di indice j
int nVi = m_vTria[i].nIdVert[j] ;
int nVf = m_vTria[i].nIdVert[Next(j)] ;
@@ -623,7 +630,7 @@ SurfTriMesh::AdjustOrientations( int nLev, bool& bSomeWrong)
// ciclo sui lati del triangolo
for ( int j = 0 ; j < 3 ; ++ j) {
// se non c'è adiacenza
if ( m_vTria[i].nIdAdjac[j] == VT_NULL)
if ( m_vTria[i].nIdAdjac[j] == SVT_NULL)
++ nNull ;
// la verifico
else {
@@ -658,9 +665,9 @@ SurfTriMesh::TestClosure( void)
// ciclo sui triangoli
bool bClosed = true ;
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
if ( m_vTria[i].nIdAdjac[0] == VT_NULL ||
m_vTria[i].nIdAdjac[1] == VT_NULL ||
m_vTria[i].nIdAdjac[2] == VT_NULL)
if ( m_vTria[i].nIdAdjac[0] == SVT_NULL ||
m_vTria[i].nIdAdjac[1] == SVT_NULL ||
m_vTria[i].nIdAdjac[2] == SVT_NULL)
bClosed = false ;
}
// aggiorno la chiusura della superficie
@@ -712,7 +719,7 @@ SurfTriMesh::CreateByTriangulation( const PolyLine& PL)
// inserisco i vertici nella superficie
for ( int i = 0 ; i < int( vPnt.size()) ; ++ i) {
if ( AddVertex( vPnt[i]) == VT_NULL)
if ( AddVertex( vPnt[i]) == SVT_NULL)
return false ;
}
@@ -722,7 +729,7 @@ SurfTriMesh::CreateByTriangulation( const PolyLine& PL)
vV[0] = vTria[3*i] ;
vV[1] = vTria[3*i+1] ;
vV[2] = vTria[3*i+2] ;
if ( AddTriangle( vV) == VT_NULL)
if ( AddTriangle( vV) == SVT_NULL)
return false ;
}
@@ -753,7 +760,7 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
if ( ! PL.GetFirstPoint( ptP))
return false ;
++ nP ;
if ( AddVertex( ptP) == VT_NULL || AddVertex( ptP + vtExtr) == VT_NULL)
if ( AddVertex( ptP) == SVT_NULL || AddVertex( ptP + vtExtr) == SVT_NULL)
return false ;
nV += 2 ;
// ciclo sui punti della polilinea (per inserire vertice e suo estruso + 2 triangoli per ogni punto)
@@ -764,16 +771,16 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
// se polilinea aperta o non è l'ultimo punto
if ( ! bClosed || nP < nPointNbr) {
// aggiungo due nuovi vertici
if ( AddVertex( ptP) == VT_NULL || AddVertex( ptP + vtExtr) == VT_NULL)
if ( AddVertex( ptP) == SVT_NULL || AddVertex( ptP + vtExtr) == SVT_NULL)
return false ;
nV += 2 ;
// aggiungo triangolo in basso a sinistra
nIdV[0] = nV - 3 ; nIdV[1] = nV - 1 ; nIdV[2] = nV - 2 ;
if ( AddTriangle( nIdV) == VT_NULL)
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
// aggiungo triangolo in alto a destra
nIdV[0] = nV - 2 ; nIdV[1] = nV - 1 ; nIdV[2] = nV ;
if ( AddTriangle( nIdV) == VT_NULL)
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
}
// altrimenti ultimo punto di polilinea chiusa
@@ -781,11 +788,11 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
// non devo aggiungere i vertici, perchè coincidono con quelli iniziali
// aggiungo triangolo in basso a sinistra
nIdV[0] = nV - 1 ; nIdV[1] = 0 ; nIdV[2] = nV ;
if ( AddTriangle( nIdV) == VT_NULL)
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
// aggiungo triangolo in alto a destra
nIdV[0] = nV ; nIdV[1] = 0 ; nIdV[2] = 1 ;
if ( AddTriangle( nIdV) == VT_NULL)
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
}
}
@@ -804,7 +811,7 @@ SurfTriMesh::GetLocalBBox( BBox3d& b3Loc) const
// assegno il box in locale
b3Loc.Reset() ;
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
b3Loc.Add( m_vVert[i].ptP) ;
}
return true ;
@@ -823,7 +830,7 @@ SurfTriMesh::GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const
// assegno il box nel riferimento
b3Ref.Reset() ;
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL) {
if ( m_vVert[i].nIdTria != SVT_DEL) {
Point3d ptTemp = m_vVert[i].ptP ;
ptTemp.ToGlob( frRef) ;
b3Ref.Add( ptTemp) ;
@@ -846,7 +853,7 @@ SurfTriMesh::Translate( const Vector3d& vtMove)
// traslo i vertici
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
m_vVert[i].ptP.Translate( vtMove) ;
}
@@ -870,13 +877,13 @@ SurfTriMesh::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng,
// ruoto i vertici
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
m_vVert[i].ptP.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
}
// ruoto le normali delle facce
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
if ( m_vTria[i].nIdVert[0] != VT_DEL)
if ( m_vTria[i].nIdVert[0] != SVT_DEL)
m_vTria[i].vtN.Rotate( vtAx, dCosAng, dSinAng) ;
}
@@ -905,13 +912,13 @@ SurfTriMesh::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double
// scalo i vertici
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
m_vVert[i].ptP.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
}
// aggiorno le facce
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
if ( m_vTria[i].nIdVert[0] != VT_DEL) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
// se c'è mirror, devo invertire la faccia
if ( bMirror && ! InvertTriangle( i))
return false ;
@@ -929,7 +936,7 @@ bool
SurfTriMesh::InvertTriangle( int nT)
{
// controllo validità triangolo
if ( m_vTria[nT].nIdVert[0] == VT_DEL)
if ( m_vTria[nT].nIdVert[0] == SVT_DEL)
return false ;
// scambio di due vertici
swap( m_vTria[nT].nIdVert[1], m_vTria[nT].nIdVert[2]) ;
@@ -945,15 +952,15 @@ bool
SurfTriMesh::CalcTriangleNormal( int nT)
{
// controllo validità triangolo
if ( m_vTria[nT].nIdVert[0] == VT_DEL)
if ( m_vTria[nT].nIdVert[0] == SVT_DEL)
return false ;
// controllo validità vertici riferiti dal triangolo
if ( m_vTria[nT].nIdVert[0] >= GetVertexNum() ||
m_vVert[m_vTria[nT].nIdVert[0]].nIdTria == VT_DEL ||
m_vVert[m_vTria[nT].nIdVert[0]].nIdTria == SVT_DEL ||
m_vTria[nT].nIdVert[1] >= GetVertexNum() ||
m_vVert[m_vTria[nT].nIdVert[1]].nIdTria == VT_DEL ||
m_vVert[m_vTria[nT].nIdVert[1]].nIdTria == SVT_DEL ||
m_vTria[nT].nIdVert[2] >= GetVertexNum() ||
m_vVert[m_vTria[nT].nIdVert[2]].nIdTria == VT_DEL)
m_vVert[m_vTria[nT].nIdVert[2]].nIdTria == SVT_DEL)
return false ;
// calcolo vettori come due lati consecutivi del triangolo
Vector3d vtV1 = m_vVert[m_vTria[nT].nIdVert[1]].ptP - m_vVert[m_vTria[nT].nIdVert[0]].ptP ;
@@ -987,7 +994,7 @@ SurfTriMesh::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// inverto le facce
for ( int i = 0 ; i < GetTriangleNum() ; ++ i) {
if ( m_vTria[i].nIdVert[0] != VT_DEL) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
// inverto la faccia
if ( ! InvertTriangle( i))
return false ;
@@ -1014,7 +1021,7 @@ SurfTriMesh::ToGlob( const Frame3d& frRef)
// trasformo i vertici
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
m_vVert[i].ptP.ToGlob( frRef) ;
}
@@ -1038,7 +1045,7 @@ SurfTriMesh::ToLoc( const Frame3d& frRef)
// trasformo i vertici
for ( int i = 0 ; i < GetVertexNum() ; ++ i) {
if ( m_vVert[i].nIdTria != VT_DEL)
if ( m_vVert[i].nIdTria != SVT_DEL)
m_vVert[i].ptP.ToLoc( frRef) ;
}