Files
Include/EGkIntersCurves.h
T
Dario Sassi cb0cf8592f Include :
- EGkIntersCurveCurve.h rinominata in EGkIntersCurves.h
- aggiornamenti vari.
2015-07-07 18:34:39 +00:00

171 lines
8.3 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2014-2015
//----------------------------------------------------------------------------
// File : EGkIntersCurves.h Data : 06.07.15 Versione : 1.6g2
// Contenuto : Dichiarazione della classe intersezione curva/curva.
//
//
//
// Modifiche : 20.06.14 DS Creazione modulo.
// 06.07.15 DS Aggiunta dichiarazione classe SelfIntersCurve e
// cambiato nome da EGkIntersCurveCurve a EGkIntersCurves.
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkPoint3d.h"
#include "/EgtDev/Include/EGkCurve.h"
#include "/EgtDev/Include/EgtPointerOwner.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
//-----------------------------------------------------------------------------
//! dati di intersezione relativi ad una curva
struct IntCrvInfo {
double dU ; //!< parametro
Point3d ptI ; //!< punto sulla curva (Z della curva, intersezione a Z=0)
int nPrevTy ; //!< tipo di approccio (precedente l'intersezione)
int nNextTy ; //!< tipo di allontanamento (seguente l'intersezione)
// costruttore
IntCrvInfo( void)
: dU( 0), ptI(), nPrevTy( 0), nNextTy(0) {}
} ;
//! dati di intersezione delle due curve A e B
struct IntCrvCrvInfo {
bool bOverlap ; //!< intersezione con overlap
bool bCBOverEq ; //!< overlap su curva B equiverso o controverso con curva A
IntCrvInfo IciA[2] ; //!< IciA[0] intersez. isolata o inizio overlap, IciA[1] fine overlap
IntCrvInfo IciB[2] ; //!< IciB[0] intersez. isolata o inizio overlap, IciB[1] fine overlap
// costruttore
IntCrvCrvInfo( void)
: bOverlap( false) {}
} ;
//! vettore di IntCrvCrvInfo
typedef std::vector<IntCrvCrvInfo> ICCIVECTOR ;
//-----------------------------------------------------------------------------
// Tipo di intersezione
// puntiforme bOverlap = false bCBOverEq = non conta
// sovrapposta equiversa bOverlap = true bCBOverEq = true
// sovrapposta controversa bOverlap = true bCBOverEq = false
// Costanti per tipo di approccio/allontanamento dall'intersezione
const int ICCT_NULL = 0 ; //!< Approccio/allontanamento non definito
const int ICCT_IN = 1 ; //!< Approccio/allontanamento interno
const int ICCT_OUT = 2 ; //!< Approccio/allontanamento esterno
const int ICCT_ON = 3 ; //!< Approccio/allontanamento sovrapposto
//! Calcolo del tipo duale
inline int GetDualIcct( int nType)
{ switch ( nType) {
case ICCT_IN : return ICCT_OUT ;
case ICCT_OUT : return ICCT_IN ;
default : return nType ;
}}
//-----------------------------------------------------------------------------
//! Classificazione di parti di curva rispetto ad altra curva chiusa
struct CrvClass {
double dParS ;
double dParE ;
int nClass ;
// costruttore
CrvClass( void)
: dParS( 0), dParE( 0), nClass( 0) {}
} ;
//! Vettore di CrvClass
typedef std::vector<CrvClass> CRVCVECTOR ;
//-----------------------------------------------------------------------------
// Costanti per classe parti di curva rispetto a curva chiusa
const int CRVC_NULL = 0 ; //!< Parte di curva non classificabile
const int CRVC_IN = 1 ; //!< Parte di curva interna
const int CRVC_OUT = 2 ; //!< Parte di curva esterna
const int CRVC_ON_P = 3 ; //!< Parte di curva sovrapposta equiversa
const int CRVC_ON_M = 4 ; //!< Parte di curva sovrapposta controversa
//-----------------------------------------------------------------------------
//! Classe per calcolo intersezione tra due curve nel piano XY locale
class IntersCurveCurve
{
public :
//! Le intersezioni sono calcolate nel piano XY locale.<br>
//! Il flag bAreSegments vale solo per intersezione tra due linee e riguarda entrambe.
EGK_EXPORT IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB, bool bAreSegments = true) ;
public :
//! Indica la presenza di intersezioni con sovrapposizioni
EGK_EXPORT bool GetOverlaps( void) ;
//! Restituisce il numero di intersezioni (intersezioni doppie coincidenti e sovrapposte contano uno)
EGK_EXPORT int GetNumInters( void) ;
//! Restituisce informazioni sull'intersezione di indice nInd ( 0 based)
EGK_EXPORT bool GetIntCrvCrvInfo( int nInd, IntCrvCrvInfo& aInfo) ;
//! Restituisce il punto di intersezione più vicino al punto passato
EGK_EXPORT bool GetIntersPointNearTo( int nCrv, const Point3d& ptNear, Point3d& ptI) ;
//! Restituisce la classificazione di una curva rispetto all'altra ( nCrv=0 -> CurvaA, nCrv=1 -> CurvaB)
EGK_EXPORT bool GetCurveClassification( int nCrv, CRVCVECTOR& ccClass) ;
private :
IntersCurveCurve( void) ;
bool IsArcToApprox( const ICurve& Curve) ;
void LineLineCalculate( const ICurve& CurveA, const ICurve& CurveB, bool bAreSegments) ;
void LineArcCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void LineCrvCompoCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void ArcLineCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void ArcArcCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void ArcCrvCompoCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void CrvCompoLineCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void CrvCompoArcCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
void CrvCompoCrvCompoCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
bool SwapInfoAB( ICCIVECTOR& Info, int IndCrvOrd) ;
bool CalcCurveClassification( const ICurve* pCurve, const ICCIVECTOR& Info, CRVCVECTOR& ccClass) ;
bool CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB, CRVCVECTOR& ccClass) ;
bool GetCurveOutClass( const ICurve* pCurve, int& nClass) ;
private :
bool m_bOverlaps ;
int m_nNumInters ;
ICCIVECTOR m_Info ;
const ICurve* m_pOriCrv[2] ; // puntatori alle curve originali
const ICurve* m_pCurve[2] ; // puntatori alle curve usate nei calcoli (originali o temporanee)
PtrOwner<ICurve> m_pTmpCrv[2] ; // eventuale esplosione temporanea delle curve
} ;
//-----------------------------------------------------------------------------
//! Classe per calcolo auto-intersezioni di una curva nel piano XY locale
class SelfIntersCurve
{
public :
//! Le intersezioni sono calcolate nel piano XY locale.<br>
EGK_EXPORT SelfIntersCurve( const ICurve& Curve) ;
public :
//! Indica la presenza di intersezioni con sovrapposizioni
EGK_EXPORT bool GetOverlaps( void) ;
//! Restituisce il numero di auto-intersezioni (intersezioni doppie coincidenti e sovrapposte contano uno)
EGK_EXPORT int GetNumInters( void) ;
//! Restituisce informazioni sull'auto-intersezione di indice nInd ( 0 based)
EGK_EXPORT bool GetIntCrvCrvInfo( int nInd, IntCrvCrvInfo& aInfo) ;
//! Restituisce il punto di auto-intersezione più vicino al punto passato
EGK_EXPORT bool GetIntersPointNearTo( const Point3d& ptNear, Point3d& ptI) ;
private :
SelfIntersCurve( void) ;
bool IsArcToApprox( const ICurve& Curve) ;
void CrvCompoCrvCompoCalculate( const ICurve& CurveA, const ICurve& CurveB) ;
bool SwapInfoAB( ICCIVECTOR& Info, int IndCrvOrd) ;
private :
bool m_bOverlaps ;
int m_nNumInters ;
ICCIVECTOR m_Info ;
const ICurve* m_pOriCrv ; // puntatore alla curva originale
const ICurve* m_pCurve ; // puntatore alla curva usata nei calcoli (originale o temporanea)
PtrOwner<ICurve> m_pTmpCrv ; // eventuale esplosione temporanea della curva
} ;