EgtGeomKernel 2.2g1 :

- corrette booleane di trimesh per facce che si intersecano solo su edge di triangoli
- a VolZmap aggiunta funzione GetPartMinDistFromPoint.
This commit is contained in:
Dario Sassi
2020-07-13 13:25:44 +00:00
parent 6e76f85f16
commit ac6d3d7d4d
4 changed files with 57 additions and 1 deletions
+55
View File
@@ -14,6 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "VolZmap.h"
#include "DistPointLine.h"
#include "GeoObjFactory.h"
#include "NgeWriter.h"
#include "NgeReader.h"
@@ -1359,6 +1360,60 @@ VolZmap::RemovePart( int nPart)
return true ;
}
//----------------------------------------------------------------------------
int
VolZmap::GetPartMinDistFromPoint( const Point3d& ptP) const
{
// Verifico lo stato e che siano definibili le componenti connesse
if ( m_nStatus != OK || m_nMapNum == 1)
return - 1 ;
// Se il numero di componenti è indefinito, lo ricalcolo
if ( m_nConnectedCompoCount == -1)
const_cast<VolZmap*>( this)->CheckMapConnection() ;
// Se non vi sono componenti, abbiamo finito
if ( m_nConnectedCompoCount == 0)
return - 1 ;
// Porto il punto nel riferimento intrinseco
Point3d ptPL = ptP ;
ptPL.ToLoc( m_MapFrame) ;
// Trovo la componente connessa di minima distanza dal punto
double dMinDist = DBL_MAX ;
int nMinDistPart = - 1 ;
for ( int nMap = 0 ; nMap < m_nMapNum ; ++ nMap) {
for ( int nDex = 0 ; nDex < m_nDim[nMap] ; ++ nDex) {
double dX = ( ( nDex % m_nNx[nMap]) + 0.5) * m_dStep ;
double dY = ( ( nDex / m_nNx[nMap]) + 0.5) * m_dStep ;
int nIntervalNum = int( m_Values[nMap][nDex].size()) ;
for ( int nInt = 0 ; nInt < nIntervalNum ; ++ nInt) {
Point3d ptSt( dX, dY, m_Values[nMap][nDex][nInt].dMin) ;
Point3d ptEn( dX, dY, m_Values[nMap][nDex][nInt].dMax) ;
// Riporto le coordinate cicliche delle normali nell'ordine di partenza (da griglia a sistema intrinseco)
if ( nMap == 1) {
swap( ptSt.x, ptSt.z) ;
swap( ptSt.y, ptSt.z) ;
swap( ptEn.x, ptEn.z) ;
swap( ptEn.y, ptEn.z) ;
}
else if ( nMap == 2) {
swap( ptSt.y, ptSt.z) ;
swap( ptSt.x, ptSt.z) ;
swap( ptEn.y, ptEn.z) ;
swap( ptEn.x, ptEn.z) ;
}
// Calcolo la distanza del punto dal segmento corrente. Se è minore della minima distanza aggiorno quest'ultima
// e la corrispondente componente connessa di minima distanza con la distanza e la componente connessa correnti.
double dDist ;
DistPointLine DistCalc( ptPL, ptSt, ptEn) ;
if ( DistCalc.GetDist( dDist) && dDist < dMinDist) {
dMinDist = dDist ;
nMinDistPart = m_Values[nMap][nDex][nInt].nCompo ;
}
}
}
}
return nMinDistPart ;
}
//----------------------------------------------------------------------------
bool
VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt)