EgtGeomkernel :
- modifiche a Zmap per visualizzazione con catene di feature.
This commit is contained in:
@@ -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) ;
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user