diff --git a/EGkTriangle3d.h b/EGkTriangle3d.h index db8b752..4bf0a3d 100644 --- a/EGkTriangle3d.h +++ b/EGkTriangle3d.h @@ -23,7 +23,7 @@ class Triangle3d { public : - Triangle3d( void) : m_nFlag( 0) + Triangle3d( void) : m_nGrade( 0) { m_nAttr[0] = 0 ; m_nAttr[1] = 0 ; m_nAttr[2] = 0 ; } void Set( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2) { m_ptP[0] = ptP0 ; m_ptP[1] = ptP1 ; m_ptP[2] = ptP2 ; m_vtN.Set( 0, 0, 0) ; } @@ -35,8 +35,8 @@ class Triangle3d m_ptP[nInd] = ptV ; return true ; } - bool SetFlag( int nFlag) - { m_nFlag = nFlag ; + bool SetGrade( int nFlag) + { m_nGrade = nFlag ; return true ; } bool SetAttrib( int nInd, int nVal) @@ -112,8 +112,8 @@ class Triangle3d else return m_ptP[2] ; } - int GetFlag( void) const - { return m_nFlag ; } + int GetGrade( void) const + { return m_nGrade ; } int GetAttrib( int nInd) const { if ( nInd >= 0 && nInd < 3) return m_nAttr[nInd] ; @@ -139,10 +139,10 @@ class Triangle3d return ( (std::max)( dSqDistA, (std::max)( dSqDistB, dSqDistC)) / dTwoArea) ; } - private : + protected : Point3d m_ptP[3] ; Vector3d m_vtN ; - int m_nFlag ; + int m_nGrade ; int m_nAttr[3] ; } ; @@ -156,6 +156,14 @@ typedef std::vector TRIA3DLISTVECTOR ; // vettore di liste di Tria // Flags indicanti se i lati sono parte del contorno di un poligono di pił triangoli class TriFlags3d { + public : + TriFlags3d( void) + { bFlag[0] = true ; bFlag[1] = true ; bFlag[2] = true ; } + TriFlags3d( bool bF) + { bFlag[0] = bF ; bFlag[1] = bF ; bFlag[2] = bF ; } + TriFlags3d( bool bF0, bool bF1, bool bF2) + { bFlag[0] = bF0 ; bFlag[1] = bF1 ; bFlag[2] = bF2 ; } + public : bool bFlag[3] ; } ; @@ -164,10 +172,82 @@ class TriFlags3d // Normali sui vertici, ottenute mediando opportunamente coi triangoli vicini class TriNormals3d { + public : + TriNormals3d( void) + {} + TriNormals3d( const Vector3d& vtNrm) + { vtN[0] = vtNrm ; vtN[1] = vtNrm ; vtN[2] = vtNrm ; } + TriNormals3d( const Vector3d& vtN0, const Vector3d& vtN1, const Vector3d& vtN2) + { vtN[0] = vtN0 ; vtN[1] = vtN1 ; vtN[2] = vtN2 ; } + public : Vector3d vtN[3] ; } ; +//----------------------------------------------------------------------------- +// Classe derivata da Triangle3d che include anche i flag dei lati e le normali dei vertici +class Triangle3dEx : public Triangle3d +{ + public : + Triangle3dEx( void) + {} + Triangle3dEx( const Triangle3d& trTria) + { *(static_cast(this)) = trTria ; + for ( int i = 0 ; i < 3 ; ++ i) + m_triN.vtN[i] = m_vtN ; + } + bool SetEdgeFlag( int nInd, bool bVal) + { if ( nInd < 0 || nInd >= 3) + return false ; + m_triF.bFlag[nInd] = bVal ; + return true ; + } + bool GetEdgeFlag( int nInd) const + { if ( nInd >= 0 && nInd < 3) + return m_triF.bFlag[nInd] ; + else if ( nInd < 0) + return m_triF.bFlag[0] ; + else + return m_triF.bFlag[2] ; + } + const TriFlags3d& GetTriFlags( void) const + { return m_triF ; } + bool SetVertexNorm( int nInd, const Vector3d& vtN) + { if ( nInd < 0 || nInd >= 3) + return false ; + m_triN.vtN[nInd] = vtN ; + return true ; + } + const Vector3d& GetVertexNorm( int nInd) const + { if ( nInd >= 0 && nInd < 3) + return m_triN.vtN[nInd] ; + else if ( nInd < 0) + return m_triN.vtN[0] ; + else + return m_triN.vtN[2] ; + } + const TriNormals3d& GetTriNormals( void) const + { return m_triN ; } + bool Validate( bool bOverwrite = false) + { if ( ! Triangle3d::Validate( bOverwrite)) + return false ; + for ( int i = 0 ; i < 3 ; ++ i) { + if ( m_triN.vtN[i].IsZero()) + m_triN.vtN[i] = m_vtN ; + } + return true ; + } + private : + TriFlags3d m_triF ; + TriNormals3d m_triN ; +} ; + +//---------------------------------------------------------------------------- +// Raccolte di Triangle3dEx +typedef std::vector TRIA3DEXVECTOR ; // vettore di Triangle3dEx +typedef std::list TRIA3DEXLIST ; // lista di Triangle3dEx +typedef std::vector TRIA3DEXLISTVECTOR ; // vettore di liste di Triangle3dEx + //----------------------------------------------------------------------------- enum PlaneType { PL_NULL = 0, PL_XY = 1, diff --git a/EGkVolZmap.h b/EGkVolZmap.h index 7a1a775..8326460 100644 --- a/EGkVolZmap.h +++ b/EGkVolZmap.h @@ -30,12 +30,12 @@ class __declspec( novtable) IVolZmap : public IGeoObj virtual bool Create( const Point3d& ptO, double dDimX, double dDimY, double dDimZ, double dPrec, bool bTriDex) = 0 ; virtual bool CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bTriDex) = 0 ; virtual bool CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex) = 0 ; - virtual bool GetAllTriangles( TRIA3DLIST& lstTria) const = 0 ; + virtual bool GetAllTriangles( TRIA3DEXLIST& lstTria) const = 0 ; virtual int GetBlockCount( void) const = 0 ; virtual bool GetVolume( double& dVol) const = 0 ; virtual int GetPartCount( void) const = 0 ; virtual bool GetPartVolume( int nPart, double& dVol) const = 0 ; - virtual bool GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DLISTVECTOR& vLstTria) const ; + virtual bool GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLISTVECTOR& vLstTria) const ; virtual bool GetDexelLines( int nDir, int nPos1, int nPos2, POLYLINELIST& lstPL) const = 0 ; virtual bool SetTolerances( double dLinTol, double dAngTolDeg = 90) = 0 ; virtual bool SetStdTool( const std::string& sToolName, double dH, double dR, double dCornR, int nFlag) = 0 ;