EgtGeomkernel :

- modifiche a Zmap per visualizzazione con catene di feature.
This commit is contained in:
Dario Sassi
2018-03-23 11:16:56 +00:00
parent 3b6de06fd9
commit e00d048d5d
5 changed files with 855 additions and 745 deletions
+2
View File
@@ -1082,6 +1082,8 @@ VolZmap::ClonePart( int nPart) const
for ( unsigned int nCount = 0 ; nCount < pVolume->m_nNumBlock ; ++ nCount)
pVolume->m_BlockToUpdate[nCount] = true ;
// Dimensiono raccolta di voxel di confine
pVolume->m_InterBlockVox.resize( pVolume->m_nNumBlock) ;
// Dimensiono raccolta triangoli di feature tra blocchi
pVolume->m_InterBlockTria.resize( pVolume->m_nNumBlock) ;
+51 -36
View File
@@ -27,26 +27,11 @@
#include <unordered_map>
#include <stack>
//----------------------------------------------------------------------------
struct TriaStruct {
int i, j, k ;
PNTVECTOR ptCompoVert ;
std::vector<TRIA3DEXVECTOR> vCompoTria ;
std::vector<std::vector<bool>> vbFlipped ;
} ;
// Vettore di TriaStruct con sharp fature interni a un blocco
typedef std::vector<TriaStruct> TriHolder ;
// Vettore di TriHolder con sharp feature di frontiera:
// il primo indice individua il blocco, il secondo il voxel
typedef std::vector<TriHolder> TriaMatrix ;
// ------------------------- STRUTTURA VERTICE TRIANGOLO - NORMALE ALLA SUPERFICIE ------------------------------------------------
struct VectorField {
Point3d ptInt ;
Vector3d vtNorm ;
int nToolFlag ;
// ------------------------- STRUTTURE -----------------------------------------------------------
struct AppliedVector {
Point3d ptPApp ;
Vector3d vtVec ;
int nPropIndex ;
} ;
//----------------------------------------------------------------------------
@@ -143,11 +128,38 @@ class VolZmap : public IVolZmap, public IGeoObjRW
HeigthAndColor( void) : nTool( 0), dHeigth( 0) {}
HeigthAndColor( int nT, double dH) : nTool( nT), dHeigth( dH) {}
} ;
typedef std::unordered_map <int, HeigthAndColor> VoxelContainer ;
// Struttura voxel
struct Voxel {
typedef std::unordered_map <int, HeigthAndColor> FlatVoxelContainer ;
// Struttura indici di voxel
struct VoxelIndexes {
int nI, nJ, nK ;
} ;
// Struttura per componenti connesse
struct ConComp {
Point3d ptVert ;
AppliedVector CompVecField[7] ;
int nVertNum ;
bool bInside ;
bool bCorner ;
} ;
// Struttura per Voxel
struct Voxel {
int i, j, k ;
int nNumComp ;
ConComp Compo[4] ;
} ;
// Triangoli
struct TriaStruct {
int i, j, k ;
PNTVECTOR ptCompoVert ;
std::vector<TRIA3DEXVECTOR> vCompoTria ;
std::vector<BOOLVECTOR> vbFlipped ;
} ;
// Vettore di TriaStruct con sharp feature interni a un blocco
typedef std::vector<TriaStruct> TriHolder ;
// Vettore di TriHolder con sharp feature di frontiera: il primo indice individua il blocco, il secondo il voxel
typedef std::vector<TriHolder> TriaMatrix ;
// Tavola hash di Voxel
typedef std::unordered_map <int, Voxel> VoxelContainer ;
private :
bool CopyFrom( const VolZmap& clSrc) ;
@@ -158,27 +170,30 @@ class VolZmap : public IVolZmap, public IGeoObjRW
bool AddDexelSideFace( int nPos, int nPosAdj, const Point3d& ptP, const Point3d& ptQ,
const Vector3d& vtZ, const Vector3d& vtNorm, TRIA3DEXLIST& lstTria) const ;
bool ProcessCube( int nVoxI, int nVoxJ, int nVoxK, int& nCubeIndex, TRIA3DEXLIST& lstTria) const ;
bool ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, TriHolder& triHold, bool bExt) const ; ///// ora
bool ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, TriHolder& triHold, bool bExt) const ;
bool ProcessCell( int nGrid, int nCellI, int nCellJ, const Plane3d& plPlane, std::vector<CurveLine>& vLine) const ;
bool ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold) const ;
bool ExtMarchingCubes( std::vector<Voxel>& vVox, TRIA3DEXLIST& lstTria, bool bEnh) const ;
bool ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vVox) const ;
bool ExtMarchingCubes( std::vector<VoxelIndexes>& vVox, TRIA3DEXLIST& lstTria, bool bEnh) const ;
bool RegulateFeaturesChain( std::vector<VoxelContainer>& vVecVox) const ;
bool CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVox, TriHolder& triHold) const ;
bool FlipEdgesII( TriHolder& TriHold) const ;
bool FlipEdgesBB( TriaMatrix& InterTria) const ;
bool IsThereMat( int nI, int nJ, int nK) const ;
bool InOut( const Plane3d& plPlane, int nGrid, int nI, int nJ) const ;
int CalcIndex( int nI, int nJ, int nK) const ;
int CalcIndexForPlaneCells( const Plane3d& plPlane, int nGrid, int nCellI, int nCellJ) const ;
bool IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vfField) const ;
bool IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, AppliedVector& vfField) const ;
bool IsPointInsideVoxelApprox( int nI, int nJ, int nK, const Point3d& ptP, double dPrec = EPS_SMALL) const ;
bool GetPointVoxel( const Point3d& ptP, int& nVoxI, int& nVoxJ, int& nVoxK) const ;
bool IsZInsideInterval( int nGrid, int nDex, double dZ) const ;
// Per regolarizzazione della catena di feature
bool FindAdjComp( const std::vector<VoxelContainer>& vVecVox, int nCurBlock, int nCurVox, int nCurComp,
INTVECTOR& vAdjBlockVoxComp, INTVECTOR& vAdjBordBlockVoxComp) const ;
// OPERAZIONI SU INTERVALLI
bool SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ,
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
bool AddIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ,
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
// SOTTRAZIONI
// UTENSILI
// Asse di simmetria parallelo a Z
@@ -295,11 +310,11 @@ class VolZmap : public IVolZmap, public IGeoObjRW
bool IsATriangleOnBorder( const Triangle3dEx& trTria, const Point3d& ptVert,
const int nBlockLimits[], const int nVoxIJK[]) const ;
// Funzioni per facce canoniche con grandi triangoli
bool ProcessVoxContXY( VoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool ProcessVoxContYZ( VoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool ProcessVoxContXZ( VoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool Find( const VoxelContainer& VoxCont, int nI, int nJ, int nK, double dPos, int nTool) const ;
bool Remove( VoxelContainer& VoxCont, int nI, int nJ, int nK) const ;
bool ProcessVoxContXY( FlatVoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool ProcessVoxContXZ( FlatVoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLIST& lstTria) const ;
bool Find( const FlatVoxelContainer& VoxCont, int nI, int nJ, int nK, double dPos, int nTool) const ;
bool Remove( FlatVoxelContainer& VoxCont, int nI, int nJ, int nK) const ;
// Connessione Zmap
struct IntervalIndexes {
size_t tMap ;
@@ -340,18 +355,18 @@ class VolZmap : public IVolZmap, public IGeoObjRW
Vector3d vtMaxN ;
int nCompo ;
} ;
std::vector<std::vector<Data>> m_Values[N_MAPS] ; // dexel delle 3 griglie
unsigned int m_nVoxNumPerBlock ; // Numero di voxel per blocco
unsigned int m_nFracLin[3] ; // Numero di blocchi per ogni asse
unsigned int m_nNumBlock ; // Numero totale di blocchi
mutable std::vector<bool> m_BlockToUpdate ;
mutable BOOLVECTOR m_BlockToUpdate ;
int m_nConnectedCompoCount ; // Se == - 1 il numero di componenti non è noto
// Se >= 0 è il numero di componenti connesse
mutable std::vector<VoxelContainer> m_InterBlockVox ;
mutable TriaMatrix m_InterBlockTria ;
Tool m_Tool ;
+2 -2
View File
@@ -420,7 +420,7 @@ VolZmap::GetDepthWithVoxel( const Point3d& ptP, const Vector3d& vtD, double& dIn
int nPlaneK = ( vtD.z >= 0 ? 1 : 0) ;
// Ciclo sui voxel
vector<Voxel> vVox ;
vector<VoxelIndexes> vVox ;
while ( IsValidVoxel( nVoxI, nVoxJ, nVoxK)) {
// Estremi della diagonale del voxel corrente
Point3d ptMin( ( nVoxI * N_DEXVOXRATIO + 0.5) * m_dStep,
@@ -431,7 +431,7 @@ VolZmap::GetDepthWithVoxel( const Point3d& ptP, const Vector3d& vtD, double& dIn
( ( nVoxK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep) ;
// Studio il voxel corrente
if ( IntersLineBox( ptP, vtD, ptMin, ptMax)) {
Voxel NewVox ;
VoxelIndexes NewVox ;
NewVox.nI = nVoxI ;
NewVox.nJ = nVoxJ ;
NewVox.nK = nVoxK ;
+7 -4
View File
@@ -151,9 +151,10 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)
m_BlockToUpdate[nCount] = true ;
// Dimensiono raccolta triangoli di feature tra blocchi
// Dimensiono raccolta di voxel e triangoli di feature tra blocchi
m_InterBlockVox.resize( m_nNumBlock) ;
m_InterBlockTria.resize( m_nNumBlock) ;
// Aggiornamento dello stato
m_nStatus = OK ;
@@ -469,7 +470,8 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)
m_BlockToUpdate[nCount] = true ;
// Dimensiono raccolta triangoli di feature tra blocchi
// Dimensiono raccolta di voxel e triangoli di feature tra blocchi
m_InterBlockVox.resize( m_nNumBlock) ;
m_InterBlockTria.resize( m_nNumBlock) ;
// Aggiornamento dello stato
@@ -676,7 +678,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)
m_BlockToUpdate[nCount] = true ;
// Dimensiono raccolta triangoli di feature tra blocchi
// Dimensiono raccolta di voxel e triangoli di feature tra blocchi
m_InterBlockVox.resize( m_nNumBlock) ;
m_InterBlockTria.resize( m_nNumBlock) ;
// Aggiornamento dello stato
+793 -703
View File
File diff suppressed because it is too large Load Diff