Files
EgtGeomKernel/SurfTriMeshOffset.cpp
T
Riccardo Elitropi 626d5b0e51 EgtGeomKernel 2.7f2 :
- Aggiunte funzioni per calcolo di Offset per superfici chiuse TriMesh
- Piccola miglioria alla triangolazione (con SaraP)
- Migliorie per rimozioni TJunction, calcolo delle normali dei triangoli e creazione di una TriMesh a partire da uno ZMap (con SaraP)
- Aggiunte funzioni di SubtractMap e piccole modifiche per estensione dei Box di creazione per gli Zmap.
2025-06-16 11:34:23 +02:00

75 lines
2.8 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2014-2022
//----------------------------------------------------------------------------
// File : SurfTriMeshOffset.cpp Data : 10.06.25 Versione : 2.7e4
// Contenuto : Implementazione funzione per Offset di Superfici TriMesh.
//
//
//
// Modifiche : 10.06.25 RE Creazione modulo.
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "SurfTriMesh.h"
#include "VolZmap.h"
using namespace std ;
//----------------------------------------------------------------------------
static ISurfTriMesh*
SumStm( const CISURFTMPVECTOR& vStm)
{
// se vettore vuoto, non faccio nulla
if ( vStm.empty())
return nullptr ;
// definisco la superficie somma tra tutte ( la prima deve essere valida)
PtrOwner<ISurfTriMesh> pStmAdd( CreateSurfTriMesh()) ;
if ( IsNull( pStmAdd))
return nullptr ;
// scorro le superfici
for ( const ISurfTriMesh* pStm : vStm) {
if ( pStm == nullptr || ! pStm->IsValid() || pStm->GetTriangleCount() == 0)
continue ;
if ( ! pStmAdd->IsValid() || pStmAdd->GetTriangleCount() == 0) {
if ( ! pStmAdd->CopyFrom( pStm))
return nullptr ;
}
else
pStmAdd->Add( *pStm) ;
}
// restituisco la superficie ottenuta
return ( Release( pStmAdd)) ;
}
//----------------------------------------------------------------------------
/* Funzione che crea l'Offset di una superficie TriMesh chiusa */
ISurfTriMesh*
CreateSurfTriMeshOffset( const ISurfTriMesh* pStm, double dOffs, double dLinTol)
{
return CreateSurfTriMeshesOffset( { pStm}, dOffs, dLinTol) ;
}
//----------------------------------------------------------------------------
/* Funzione che crea l'Offset di un insieme di superfici */
ISurfTriMesh*
CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLinTol)
{
// se vettore delle superfici vuoto, non faccio nulla
if ( vStm.empty())
return nullptr ;
// controllo sul valore di tolleranza lineare
double dMyLinTol = max( dLinTol, 10 * EPS_SMALL) ;
// --- NB. ( Il valore di Offset deve essere maggiore di 10 * EPS_SMALL in valore assoluto)
// Nel caso sia minore, restituisco semplicemente la somma delle superfici
// ( questo valore serve per rimanere coerente con l'Offset delle curve)
if ( abs( dOffs) < 10 * EPS_SMALL)
return SumStm( vStm) ;
// --- NB. Per la creazione dello Zmap è necessario che le superfici siano chiuse
PtrOwner<IVolZmap> pVolZmap( CreateVolZmap()) ;
if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshOffset( vStm, dOffs, dMyLinTol))
return nullptr ;
// restituisco la superficie TriMesh
return ( pVolZmap->GetSurfTriMesh()) ;
}