From 8f5ce2ac0966308826c846c8cd02b664ad55f6d3 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 30 Sep 2019 09:18:45 +0000 Subject: [PATCH] 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. --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes SurfTriMesh.h | 3 ++ SurfTriMeshFaceting.cpp | 81 ++++++++++++++++++++++++++++++++++++++++ VolZmap.cpp | 12 +++--- 4 files changed, 90 insertions(+), 6 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index f363cc84ba8931e2f07c11c3915b6c70056174df..e0c4a5cda281d7a211312473ea42cf05aa4318ad 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&Qw&A-_cnHh~ID{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-W11TR delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U diff --git a/SurfTriMesh.h b/SurfTriMesh.h index 913610b..6f1d6ba 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -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 ; diff --git a/SurfTriMeshFaceting.cpp b/SurfTriMeshFaceting.cpp index dc02e19..d54fb2e 100644 --- a/SurfTriMeshFaceting.cpp +++ b/SurfTriMeshFaceting.cpp @@ -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 ; +} diff --git a/VolZmap.cpp b/VolZmap.cpp index 39af1f9..88ef179 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -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 ;