EgtGeomKernel 2.1i3 :

- correzione a Zmap per eliminazione spilloni orfani (piccoli e all'interno di un voxel)
- aggiunte a SurfTriMesh funzioni SwapFacets, GetFacetLocalBBox e GetFacetBBox.
This commit is contained in:
Dario Sassi
2019-09-30 09:18:45 +00:00
parent 345dc7e896
commit 8f5ce2ac09
4 changed files with 90 additions and 6 deletions
BIN
View File
Binary file not shown.
+3
View File
@@ -184,6 +184,9 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
bool GetFacetArea( int nF, double& dArea) const override ;
bool GetFacetsContact( int nF1, int nF2, bool& bAdjac, Point3d& ptP1, Point3d& ptP2, double& dAng) const override ;
SurfTriMesh* CloneFacet( int nF) const override ;
bool SwapFacets( int nF1, int nF2) override ;
bool GetFacetLocalBBox( int nF, BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ;
bool GetFacetBBox( int nF, const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const override ;
bool Cut( const Plane3d& plPlane, bool bSaveOnEq) override ;
bool GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) override ;
bool GetAllTriaOverlapBox( const BBox3d& b3Box, INTVECTOR& vT) const override ;
+81
View File
@@ -688,3 +688,84 @@ SurfTriMesh::CloneFacet( int nF) const
// restituisco la superficie
return Release( pSTM) ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::SwapFacets( int nF1, int nF2)
{
// verifico esistenza delle due facce
if ( nF1 < 0 || nF1 >= GetFacetCount() || nF2 < 0 || nF2 >= GetFacetCount())
return false ;
// recupero gli indici dei triangoli della prima e seconda faccia
INTVECTOR vTria1 ;
if ( ! GetAllTriaInFacet( nF1, vTria1))
return false ;
INTVECTOR vTria2 ;
if ( ! GetAllTriaInFacet( nF2, vTria2))
return false ;
// scambio gli indici di faccia dei triangoli
for ( int i = 0 ; i < int( vTria1.size()) ; ++ i)
m_vTria[vTria1[i]].nIdFacet = nF2 ;
for ( int i = 0 ; i < int( vTria2.size()) ; ++ i)
m_vTria[vTria2[i]].nIdFacet = nF1 ;
// scambio i riferimenti al primo triangolo delle facce
swap( m_vFacet[nF1], m_vFacet[nF2]) ;
return true ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetFacetLocalBBox( int nF, BBox3d& b3Loc, int nFlag) const
{
// verifico esistenza della faccia
if ( nF < 0 || nF >= GetFacetCount())
return false ;
// recupero gli indici dei triangoli della faccia
INTVECTOR vTria ;
if ( ! GetAllTriaInFacet( nF, vTria))
return false ;
// assegno il box in locale
b3Loc.Reset() ;
for ( int i = 0 ; i < int( vTria.size()) ; ++ i) {
// indice del triangolo
int nT = vTria[i] ;
// ciclo sui tre vertici
for ( int j = 0 ; j < 3 ; ++ j)
b3Loc.Add( m_vVert[m_vTria[nT].nIdVert[j]].ptP) ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetFacetBBox( int nF, const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
{
// verifico esistenza della faccia
if ( nF < 0 || nF >= GetFacetCount())
return false ;
// recupero gli indici dei triangoli della faccia
INTVECTOR vTria ;
if ( ! GetAllTriaInFacet( nF, vTria))
return false ;
// assegno il box nel riferimento
b3Ref.Reset() ;
for ( int i = 0 ; i < int( vTria.size()) ; ++ i) {
// indice del triangolo
int nT = vTria[i] ;
// ciclo sui tre vertici
for ( int j = 0 ; j < 3 ; ++ j) {
Point3d ptTemp = m_vVert[m_vTria[nT].nIdVert[j]].ptP ;
ptTemp.ToGlob( frRef) ;
b3Ref.Add( ptTemp) ;
}
}
return true ;
}
+6 -6
View File
@@ -628,8 +628,8 @@ VolZmap::CheckMapConnection( void)
double dZMin = m_Values[tMap][tDex][tInt].dMin ;
double dZMax = m_Values[tMap][tDex][tInt].dMax ;
// Indici k dei voxels in cui cadono le Z
int nKmin = int( floor( ( dZMin - EPS_SMALL) / m_dStep - 0.5)) ;
int nKmax = int( floor( ( dZMax + EPS_SMALL) / m_dStep - 0.5)) ;
int nKmin = int( floor( ( dZMin - 2 * EPS_SMALL) / m_dStep - 0.5)) ;
int nKmax = int( floor( ( dZMax + 2 * EPS_SMALL) / m_dStep - 0.5)) ;
// Se cadono nello stesso voxel imposto a -1 il valore della componente connessa
if ( nKmax - nKmin == 0)
m_Values[tMap][tDex][tInt].nCompo = -1 ;
@@ -639,8 +639,8 @@ VolZmap::CheckMapConnection( void)
double dXMin = m_Values[tMap][tDex][tInt].dMin ;
double dXMax = m_Values[tMap][tDex][tInt].dMax ;
// Indici i dei voxels in cui cadono le X
int nImin = int( floor( ( dXMin - EPS_SMALL) / m_dStep - 0.5)) ;
int nImax = int( floor( ( dXMax + EPS_SMALL) / m_dStep - 0.5)) ;
int nImin = int( floor( ( dXMin - 2 * EPS_SMALL) / m_dStep - 0.5)) ;
int nImax = int( floor( ( dXMax + 2 * EPS_SMALL) / m_dStep - 0.5)) ;
// Se cadono nello stesso voxel imposto a -1 il valore della componente connessa
if ( nImax - nImin == 0)
m_Values[tMap][tDex][tInt].nCompo = -1 ;
@@ -650,8 +650,8 @@ VolZmap::CheckMapConnection( void)
double dYMin = m_Values[tMap][tDex][tInt].dMin ;
double dYMax = m_Values[tMap][tDex][tInt].dMax ;
// Indici j dei voxels in cui cadono le X
int nJmin = int( floor( ( dYMin - EPS_SMALL) / m_dStep - 0.5)) ;
int nJmax = int( floor( ( dYMax + EPS_SMALL) / m_dStep - 0.5)) ;
int nJmin = int( floor( ( dYMin - 2 * EPS_SMALL) / m_dStep - 0.5)) ;
int nJmax = int( floor( ( dYMax + 2 * EPS_SMALL) / m_dStep - 0.5)) ;
// Se cadono nello stesso voxel imposto a -1 il valore della componente connessa
if ( nJmax - nJmin == 0)
m_Values[tMap][tDex][tInt].nCompo = -1 ;