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:
+123
-56
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user