diff --git a/EGkCAvToolSurfTm.h b/EGkCAvToolSurfTm.h index d1f5298..67371d1 100644 --- a/EGkCAvToolSurfTm.h +++ b/EGkCAvToolSurfTm.h @@ -1,13 +1,13 @@ //---------------------------------------------------------------------------- -// EgalTech 2018-2018 +// EgalTech 2018-2019 //---------------------------------------------------------------------------- -// File : EGkCAvToolSurfTm.h Data : 08.05.18 Versione : 1.9e2 +// File : EGkCAvToolSurfTm.h Data : 06.06.19 Versione : 2.1f1 // Contenuto : Dichiarazione della classe ICAvToolSurfTm. // // // // Modifiche : 27.04.18 DS Creazione modulo. -// +// 06.06.19 DS Aggiunta gestione di più superfici. // //---------------------------------------------------------------------------- @@ -28,6 +28,7 @@ class __declspec( novtable) ICAvToolSurfTm { public : virtual ~ICAvToolSurfTm( void) {} virtual bool SetSurfTm( const ISurfTriMesh& Stm) = 0 ; + virtual bool AddSurfTm( const ISurfTriMesh& Stm) = 0 ; virtual bool SetStdTool( double dH, double dR, double dCornR) = 0 ; virtual bool SetAdvTool( double dH, double dR, double dTipH, double dTipR, double dCornR) = 0 ; virtual bool SetSawTool( double dH, double dR, double dThick, double dStemR, double dCornR) = 0 ; diff --git a/EGkSurf.h b/EGkSurf.h index 346d9bc..be82666 100644 --- a/EGkSurf.h +++ b/EGkSurf.h @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2014-2014 +// EgalTech 2014-2019 //---------------------------------------------------------------------------- -// File : EgkSurf.h Data : 07.04.14 Versione : 1.5d2 +// File : EgkSurf.h Data : 06.06.19 Versione : 2.1f1 // Contenuto : Dichiarazione della interfaccia ISurf. // // @@ -14,6 +14,9 @@ #pragma once #include "/EgtDev/Include/EGkGeoObj.h" +#include "/EgtDev/Include/EgtPointerOwner.h" +#include +#include //---------------------------------------------------------------------------- class __declspec( novtable) ISurf : public IGeoObj @@ -38,3 +41,10 @@ inline ISurf* GetSurf( IGeoObj* pGObj) { if ( pGObj == nullptr || ( pGObj->GetType() & GEO_SURF) == 0) return nullptr ; return (static_cast(pGObj)) ; } + +//---------------------------------------------------------------------------- +// Raccolte di puntatori a ISurf +typedef std::vector CISURFPVECTOR ; // vettore di puntatori a const ISurf +typedef std::vector ISURFPVECTOR ; // vettore di puntatori a ISurf +typedef std::list ISURFPLIST ; // lista di puntatori a ISurf +typedef std::vector> ISURFPOVECTOR ; // vettore di puntatori esclusivi a ISurf diff --git a/EGkTriangle3d.h b/EGkTriangle3d.h index 250f104..27aae9e 100644 --- a/EGkTriangle3d.h +++ b/EGkTriangle3d.h @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2014-2018 +// EgalTech 2014-2019 //---------------------------------------------------------------------------- -// File : EGkTria3d.h Data : 15.01.18 Versione : 1.9a1 +// File : EGkTria3d.h Data : 06.06.19 Versione : 2.1f1 // Contenuto : Dichiarazione classe triangolo Triangle3d. // // @@ -9,6 +9,7 @@ // Modifiche : 30.03.14 DS Creazione modulo. // 07.02.15 DS Agg. GetArea e GetAspectRatio. // 15.01.18 LM Agg. flag. +// 06.06.19 LM Agg. IsPointInsideTriangle. // //---------------------------------------------------------------------------- @@ -422,3 +423,60 @@ CalcNormal( const Point3d& ptP, const Triangle3d& Tria, const TriNormals3d& Tnor // la normalizzo return vtNorm.Normalize( EPS_ZERO) ; } + +//---------------------------------------------------------------------------- +enum TriangleType { OPEN = -1, EXACT = 0, CLOSED = 1 }; + +//---------------------------------------------------------------------------- +// Stabilisce se un punto appartiene a un triangolo aperto, esatto o chiuso. +inline bool +IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriType) +{ + // Se il punto non è nel box del triangolo, è sicuramente esterno + BBox3d b3Tria( trTria.GetP( 0)) ; + b3Tria.Add( trTria.GetP( 1)) ; + b3Tria.Add( trTria.GetP( 2)) ; + if ( ! b3Tria.Encloses( ptP)) + return false; + + // Se il punto non sta sul piano del triangolo, è sicuramente esterno + if ( abs( ( ptP - trTria.GetP(0)) * trTria.GetN()) > EPS_SMALL) + return false ; + + // Tolleranza di appartenenza dipendente dal tipo di triangolo + double dEps ; + switch ( nTriType) { + case OPEN : + dEps = EPS_SMALL ; + break ; + case EXACT : + dEps = 0 ; + break ; + case CLOSED: + dEps = -EPS_SMALL ; + break ; + default : + return false ; + } + + // Verifico se il punto è a destra del primo lato + Vector3d vtV0 = trTria.GetP( 1) - trTria.GetP( 0) ; + vtV0.Normalize() ; + double dProd0 = ( vtV0 ^ (ptP - trTria.GetP( 0))) * trTria.GetN() ; + if ( dProd0 < dEps) + return false ; + // Verifico se il punto è a destra del secondo lato + Vector3d vtV1 = trTria.GetP( 2) - trTria.GetP( 1) ; + vtV1.Normalize() ; + double dProd1 = ( vtV1 ^ (ptP - trTria.GetP( 1))) * trTria.GetN() ; + if ( dProd1 < dEps) + return false ; + // Verifico se il punto è a destra del terzo lato + Vector3d vtV2 = trTria.GetP( 0) - trTria.GetP( 2) ; + vtV2.Normalize() ; + double dProd2 = ( vtV2 ^ (ptP - trTria.GetP(2))) * trTria.GetN() ; + if ( dProd2 < dEps) + return false ; + // Punto a sinistra di tutti i lati, quindi interno + return true ; +} \ No newline at end of file