EgtGeomKernel 1.6b7 :

- aggiunto calcolo baricentro di Curve
- migliorata gestione richiesta nuovo Id
- aggiunta intersezione linea-piano e linea-triangolo
- corretto errore in PointGrid3d con 1 solo punto (non faceva alcunchè)
- aggiunte funzioni di accesso a dati di SurfTM.
This commit is contained in:
Dario Sassi
2015-02-24 22:47:10 +00:00
parent 0c84250259
commit 1b85e111dc
21 changed files with 602 additions and 106 deletions
+123 -56
View File
@@ -202,6 +202,18 @@ SurfTriMesh::GetTriangleNum( void) const
return ( GetTriangleSize() - nErased) ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetVertex( int nId, Point3d& ptP) const
{
// verifico esistenza del vertice
if ( nId < 0 || nId >= GetVertexSize() || m_vVert[nId].nIdTria == SVT_DEL)
return false ;
// recupero i dati
ptP = m_vVert[nId].ptP ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstVertex( Point3d& ptP) const
@@ -226,6 +238,20 @@ SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangle( int nId, int nIdVert[3]) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
return false ;
// recupero i dati
nIdVert[0] = m_vTria[nId].nIdVert[0] ;
nIdVert[1] = m_vTria[nId].nIdVert[1] ;
nIdVert[2] = m_vTria[nId].nIdVert[2] ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstTriangle( int nIdVert[3]) const
@@ -252,6 +278,21 @@ SurfTriMesh::GetNextTriangle( int nId, int nIdVert[3]) const
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
return false ;
// recupero i dati
Tria.Set( m_vVert[m_vTria[nId].nIdVert[0]].ptP,
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstTriangle( Triangle3d& Tria) const
@@ -279,6 +320,88 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
return nId ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT, bool& bCirc) const
{
const int MAX_VT_SIZE = 512 ;
// pulisco il vettore risultato
vT.clear() ;
// verifico esistenza del vertice
if ( nV < 0 || nV >= GetVertexSize() || m_vVert[nV].nIdTria == SVT_DEL)
return false ;
// recupero il triangolo puntato dal vertice
int nT = m_vVert[nV].nIdTria ;
if ( nT == SVT_NULL)
return 0 ;
vT.push_back( nT) ;
// cerco i triangoli adiacenti con lo stesso vertice in CCW
int k ;
int nTa = nT ;
do {
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[Prev(k)] ;
else
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 != SVT_NULL)
vT.push_back( nTa) ;
} 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) {
bCirc = true ;
return int( vT.size()) ;
}
// altrimenti, devo cercare i triangoli adiacenti con lo stesso vertice in CW
nTa = nT ;
do {
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[k] ;
else
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 != SVT_NULL)
vT.insert( vT.begin(), nTa) ;
} while ( nTa != nT && nTa != SVT_NULL && vT.size() < MAX_VT_SIZE) ;
bCirc = ( nTa == nT) ;
return int( vT.size()) ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetVertexSmoothNormal( int nV, int nT, Vector3d& vtN) const
{
// verifico esistenza del vertice
if ( nV < 0 || nV >= GetVertexSize() || m_vVert[nV].nIdTria == SVT_DEL)
return false ;
// verifico esistenza del triangolo
if ( nT < 0 || nT >= GetTriangleSize() || m_vTria[nT].nIdVert[0] == SVT_DEL)
return false ;
// recupero la normale del vertice
for ( int i = 0 ; i < 3 ; ++ i) {
if ( nV == m_vTria[nT].nIdVert[i]) {
if ( ! GetTriangleSmoothNormal( nT, i, vtN))
vtN = m_vTria[nT].vtN ;
return true ;
}
}
// il vertice non appartiene al triangolo
return false ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangleBoundaryEdges( int nId, TriFlags3d& TFlags) const
@@ -614,62 +737,6 @@ SurfTriMesh::FindVertexInTria( int nV, int nT, int& nK) const
return ( nK != -1) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT, bool& bCirc) const
{
const int MAX_VT_SIZE = 512 ;
// pulisco il vettore risultato
vT.clear() ;
// recupero il triangolo puntato dal vertice
int nT = m_vVert[nV].nIdTria ;
if ( nT == SVT_NULL)
return 0 ;
vT.push_back( nT) ;
// cerco i triangoli adiacenti con lo stesso vertice in CCW
int k ;
int nTa = nT ;
do {
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[Prev(k)] ;
else
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 != SVT_NULL)
vT.push_back( nTa) ;
} 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) {
bCirc = true ;
return int( vT.size()) ;
}
// altrimenti, devo cercare i triangoli adiacenti con lo stesso vertice in CW
nTa = nT ;
do {
if ( FindVertexInTria( nV, nTa, k))
nTa = m_vTria[nTa].nIdAdjac[k] ;
else
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 != SVT_NULL)
vT.insert( vT.begin(), nTa) ;
} while ( nTa != nT && nTa != SVT_NULL && vT.size() < MAX_VT_SIZE) ;
bCirc = ( nTa == nT) ;
return int( vT.size()) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::NextIndAroundVertex( int nInd, int nSize, bool bCirc) const