EgtGeomKernel :

- aggiunta HashGrids3d a SurfTm con lazy evaluation
- in CAvTool aggiunta verifica utensile ben definito.
This commit is contained in:
Dario Sassi
2018-12-10 07:50:42 +00:00
parent 9a27864087
commit b3d868bcc9
23 changed files with 349 additions and 297 deletions
+36 -9
View File
@@ -14,9 +14,10 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "ProjPlane.h"
#include "IntersLineSurfTm.h"
#include "IntersLineSurfStd.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkIntersLineTria.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
using namespace std ;
@@ -74,14 +75,40 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS
return false ;
vInfo.clear() ;
// limito la linea al box dei triangoli della superficie
const BBox3d b3Stm = Stm.GetAllTriaBox() ;
if ( b3Stm.IsEmpty())
return false ;
double dU1, dU2 ;
if ( ! IntersLineBox( ptL, vtL, b3Stm.GetMin() , b3Stm.GetMax(), dU1, dU2))
return false ;
if ( bFinite) {
dU1 = max( dU1, 0.) ;
dU2 = min( dU2, dLen) ;
if ( dU2 - dU1 < EPS_SMALL)
return false ;
}
Point3d ptStart = ptL + dU1 * vtL ;
double dLenEff = dU2 - dU1 ;
// cerco i triangoli intersecati dalla linea
Triangle3d Tria ;
int nT = Stm.GetFirstTriangle( Tria) ;
while ( nT != SVT_NULL) {
// aggiorno info con intersezione
UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, nT, Tria, vInfo, bFinite) ;
// passo al prossimo triangolo
nT = Stm.GetNextTriangle( nT, Tria) ;
const double BOX_STEP = 10 ;
int nStep = int( ceil( dLenEff / BOX_STEP)) ;
Vector3d vtStep = dLenEff / nStep * vtL ;
INTVECTOR vPrevT ;
for ( int i = 0 ; i < nStep ; ++ i) {
BBox3d b3Box( ptL + i * vtStep, ptL + ( i + 1) * vtStep) ;
INTVECTOR vT ;
if ( Stm.GetAllTriaOverlapBox( b3Box, vT)) {
for ( auto nT : vT) {
if ( find( vPrevT.begin(), vPrevT.end(), nT) == vPrevT.end()) {
vPrevT.emplace_back( nT) ;
Triangle3d Tria ;
Stm.GetTriangle( nT, Tria) ;
// aggiorno info con intersezione
UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, nT, Tria, vInfo, bFinite) ;
}
}
}
}
// ordino il vettore delle eventuali intersezioni secondo il senso crescente del parametro di linea
@@ -101,7 +128,7 @@ IntersParLinesSurfTm::IntersParLinesSurfTm( const Frame3d& frLines, const ISurfT
return ;
// creo HashGrid 2d
const int LIM_HG_TRIA = 128 ;
const int LIM_HG_TRIA = 127 ;
m_HGrids.SetActivationGrid( m_pSTm->GetTriangleCount() > LIM_HG_TRIA) ;
// riempio HashGrid