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:
Binary file not shown.
@@ -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 ;
|
||||
|
||||
@@ -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
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user