//---------------------------------------------------------------------------- // EgalTech 2024 //---------------------------------------------------------------------------- // File : EGkIntersLineSurfBez.h Data : 06.02.24 Versione : 2.6b1 // Contenuto : Dichiarazione della classe intersezione Linea/SurfTriMesh. // // // // Modifiche : 06.02.24 DB Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkIntersLineTria.h" #include "/EgtDev/Include/EGkHashGrids2d.h" #include "/EgtDev/Include/EGkSurfBezier.h" //----------------------- Macro per import/export ---------------------------- #undef EGK_EXPORT #if defined( I_AM_EGK) // da definirsi solo nella DLL #define EGK_EXPORT __declspec( dllexport) #else #define EGK_EXPORT __declspec( dllimport) #endif //----------------------------------------------------------------------------- // Costanti tipo intersezione Linea SurfTriMesh dopo filtraggio enum LSBiType { LSBT_NONE = 0, LSBT_IN = 1, LSBT_OUT = 2, LSBT_TG_INI = 3, LSBT_TG_FIN = 4, LSBT_TOUCH = 5} ; //----------------------------------------------------------------------------- // Tipo di intersezione linea-triangolo ausiliario (della trimesh ausilaria) enum IntLineTriaAuxType { ILTA_NO_TRIA = -1, // l'intersezione è stata calcolata direttamente con la superficie bezier ILTA_NO = 0, // non c'è intersezione ILTA_SEGM = 1, // una parte di linea appartiene all'interno del triangolo ILTA_SEGM_ON_EDGE = 2, // una parte di linea appartiene ad un lato del triangolo ILTA_VERT = 3, // intersezione coincide con un vertice ILTA_EDGE = 4, // intersezione coincide con interno di un lato ILTA_IN = 5} ; // intersezione in interno del triangolo //----------------------------------------------------------------------------- //! dati di intersezione linea - superficie bezier struct IntLinSbzInfo { int nILSB ; //!< tipo di intersezione linea-bezier double dU ; //!< parametro sulla linea double dU2 ; //!< secondo parametro sulla linea int nT ; //!< indice del triangolo della superficie trimesh // se -1 vuol dire che l'intersezione � stata calcolata direttamente, senza usare la trimesh double dCosDN ; //!< coseno dell'angolo tra la direzione della linea e la normale del triangolo Point3d ptI ; //!< punto di intersezione Point3d ptI2 ; //!< secondo punto di intersezione (termine di tratto sovrapposto) Point3d ptUV ; //!< coordinate del punto nello spazio parametrico Point3d ptUV2 ; //!< coordinate del secondo punto nello spazio parametrico // costruttori IntLinSbzInfo( void) : nILSB( LSBT_NONE), dU( 0), dU2( 0), nT(0), dCosDN(0), ptI(), ptI2(), ptUV(), ptUV2(){} IntLinSbzInfo( int nILS, double dUU, int nTT, double dCos, const Point3d& ptP, const Point3d ptSP) : nILSB( nILS), dU( dUU), dU2( 0), nT( nTT), dCosDN( dCos), ptI( ptP), ptI2(), ptUV( ptSP), ptUV2() {} IntLinSbzInfo( int nILS, double dUU, double dUU2, int nTT, double dCos, const Point3d& ptP, const Point3d& ptP2, const Point3d& ptSP, const Point3d& ptSP2) : nILSB( nILS), dU( dUU), dU2( dUU2), nT( nTT), dCosDN( dCos), ptI( ptP), ptI2( ptP2), ptUV( ptSP), ptUV2( ptSP2) {} } ; //! vettore di IntLinSbzInfo typedef std::vector ILSBIVECTOR ; //----------------------------------------------------------------------------- EGK_EXPORT bool IntersLineSurfBz( const Point3d& ptL, const Vector3d& vtL, double dLen, const ISurfBezier* pSBz, ILSBIVECTOR& vInfo, bool bFinite = true) ; //----------------------------------------------------------------------------- class IntersParLinesSurfBz { public : EGK_EXPORT IntersParLinesSurfBz( const Frame3d& frLines, const ISurfBezier& SBz) ; EGK_EXPORT bool GetInters( const Point3d& ptL, double dLen, ILSBIVECTOR& vInfo, bool bFinite = true) const ; private : bool m_bOk ; const Frame3d m_frLines ; const ISurfBezier* m_pSBz ; HashGrids2d m_HGrids ; } ; //----------------------------------------------------------------------------- EGK_EXPORT bool FilterLineSurfBzInters( const ILSBIVECTOR& vInfo, INTDBLVECTOR& vInters) ;