EgtGeomKernel 1.9h1 :

- sistemazioni varie in CAvToolTriangle
- utilizzo di std::async in CAvToolSurfTm
- corretto GetAllTriaAroundVertex di SurfTm
- aggiunto ( nothrow) a tutti i new.
This commit is contained in:
Dario Sassi
2018-08-08 11:02:56 +00:00
parent d0fb939541
commit 866ed0b3d7
28 changed files with 618 additions and 475 deletions
+35 -29
View File
@@ -373,14 +373,14 @@ SurfTriMesh::GetVertex( int nId, Point3d& ptP) const
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstVertex( Point3d& ptP) const
SurfTriMesh::GetFirstVertex( Point3d& ptP) const
{
return GetNextVertex( SVT_NULL, ptP) ;
return GetNextVertex( SVT_NULL, ptP) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
{
// cerco il primo successivo valido
do {
@@ -392,12 +392,12 @@ SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
// recupero i dati
ptP = m_vVert[nId].ptP ;
// ritorno indice triangolo corrente
return nId ;
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangle( int nId, int nIdVert[3]) const
SurfTriMesh::GetTriangle( int nId, int nIdVert[3]) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
@@ -406,19 +406,19 @@ SurfTriMesh::GetTriangle( int nId, int nIdVert[3]) const
nIdVert[0] = m_vTria[nId].nIdVert[0] ;
nIdVert[1] = m_vTria[nId].nIdVert[1] ;
nIdVert[2] = m_vTria[nId].nIdVert[2] ;
return true ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstTriangle( int nIdVert[3]) const
SurfTriMesh::GetFirstTriangle( int nIdVert[3]) const
{
return GetNextTriangle( SVT_NULL, nIdVert) ;
return GetNextTriangle( SVT_NULL, nIdVert) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetNextTriangle( int nId, int nIdVert[3]) const
SurfTriMesh::GetNextTriangle( int nId, int nIdVert[3]) const
{
// cerco il primo successivo valido
do {
@@ -432,12 +432,12 @@ SurfTriMesh::GetNextTriangle( int nId, int nIdVert[3]) const
nIdVert[1] = m_vTria[nId].nIdVert[1] ;
nIdVert[2] = m_vTria[nId].nIdVert[2] ;
// ritorno indice triangolo corrente
return nId ;
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
@@ -447,19 +447,19 @@ SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
return true ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstTriangle( Triangle3d& Tria) const
SurfTriMesh::GetFirstTriangle( Triangle3d& Tria) const
{
return GetNextTriangle( SVT_NULL, Tria) ;
return GetNextTriangle( SVT_NULL, Tria) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
{
// cerco il primo successivo valido
do {
@@ -474,7 +474,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
// ritorno indice triangolo corrente
return nId ;
return nId ;
}
//----------------------------------------------------------------------------
@@ -500,17 +500,20 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT, bool& bCirc) const
int k ;
int nTa = nT ;
do {
// ricerco triangolo
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])
// se non valido, esco
if ( nTa == nT || nTa == SVT_NULL)
break ;
// se valido
if ( nTa != nT && nTa != SVT_NULL)
vT.push_back( nTa) ;
} while ( nTa != nT && nTa != SVT_NULL && vT.size() < MAX_VT_SIZE) ;
// per evitare cicli infiniti dovuti a triangoli invertiti
if ( find( vT.begin(), vT.end(), nTa) != vT.end())
break ;
// inserisco in elenco
vT.push_back( nTa) ;
} while ( vT.size() < MAX_VT_SIZE) ;
// se sono ritornato al triangolo di partenza ho fatto un giro e concluso la ricerca
if ( nTa == nT) {
@@ -521,17 +524,20 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT, bool& bCirc) const
// altrimenti, devo cercare i triangoli adiacenti con lo stesso vertice in CW
nTa = nT ;
do {
// ricerco triangolo
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])
// se non valido, esco
if ( nTa == nT || nTa == SVT_NULL)
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) ;
// per evitare cicli infiniti dovuti a triangoli invertiti
if ( find( vT.begin(), vT.end(), nTa) != vT.end())
break ;
// inserisco in elenco
vT.insert( vT.begin(), nTa) ;
} while ( vT.size() < MAX_VT_SIZE) ;
bCirc = ( nTa == nT) ;
return int( vT.size()) ;
@@ -873,7 +879,7 @@ SurfTriMesh*
SurfTriMesh::Clone( void) const
{
// alloco oggetto
SurfTriMesh* pStm = new(nothrow) SurfTriMesh ;
SurfTriMesh* pStm = new( nothrow) SurfTriMesh ;
if ( pStm != nullptr) {
if ( ! pStm->CopyFrom( *this)) {
delete pStm ;