184 lines
6.8 KiB
C++
184 lines
6.8 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2013-2013
|
|
//----------------------------------------------------------------------------
|
|
// File : EGkPoint3d.h Data : 20.11.13 Versione : 1.3a1
|
|
// Contenuto : Dichiarazione della classe Punto 3d.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 30.12.12 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "/EgtDev/Include/EGkVector3d.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
|
|
|
|
//-------------------------- Forward Definition -------------------------------
|
|
class Frame3d ;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
class EGK_EXPORT Point3d
|
|
{
|
|
public :
|
|
inline Point3d( double dX, double dY, double dZ) { x = dX ; y = dY ; z = dZ ;}
|
|
inline Point3d( double dX, double dY) { x = dX ; y = dY ; z = 0 ;}
|
|
inline Point3d( void) { x = 0 ; y = 0 ; z = 0 ;}
|
|
inline void Set( double dX, double dY, double dZ) { x = dX ; y = dY ; z = dZ ;}
|
|
inline const Point3d& operator =( const Point3d& ptSrc)
|
|
{ if ( &ptSrc != this) {
|
|
x = ptSrc.x , y = ptSrc.y , z = ptSrc.z ; }
|
|
return *this ; }
|
|
public :
|
|
void Translate( const Vector3d& vtMove) ;
|
|
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngRad) ;
|
|
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) ;
|
|
bool Scale( const Point3d& ptCen, double dCoeffX, double dCoeffY, double dCoeffZ) ;
|
|
bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) ;
|
|
bool ToGlob( const Frame3d& frRef) ;
|
|
bool ToLoc( const Frame3d& frRef) ;
|
|
|
|
public :
|
|
double x ;
|
|
double y ;
|
|
double z ;
|
|
} ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Punti notevoli
|
|
//----------------------------------------------------------------------------
|
|
const Point3d ORIG( 0, 0, 0) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Somma di due punti
|
|
// (valida solo se equivalente ad una combinazione baricentrica).
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
operator+( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
return Point3d( ptP1.x + ptP2.x, ptP1.y + ptP2.y, ptP1.z + ptP2.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Somma di un punto e un vettore
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
operator+( const Point3d& ptP1, const Vector3d& vtV2)
|
|
{
|
|
return Point3d( ptP1.x + vtV2.x, ptP1.y + vtV2.y, ptP1.z + vtV2.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Opposto di un punto
|
|
//----------------------------------------------------------------------------
|
|
inline Vector3d
|
|
operator-( const Point3d& ptP)
|
|
{
|
|
return Vector3d( - ptP.x, - ptP.y, - ptP.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Differenza di due punti, genera un vettore
|
|
//----------------------------------------------------------------------------
|
|
inline Vector3d
|
|
operator-( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
return Vector3d( ptP1.x - ptP2.x, ptP1.y - ptP2.y, ptP1.z - ptP2.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Sottrazione di un punto e un vettore
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
operator-( const Point3d& ptP1, const Vector3d& vtV2)
|
|
{
|
|
return Point3d( ptP1.x - vtV2.x, ptP1.y - vtV2.y, ptP1.z - vtV2.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Prodotto con uno scalare
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
operator*( const Point3d& ptP, double dMul)
|
|
{
|
|
return Point3d( ptP.x * dMul, ptP.y * dMul, ptP.z * dMul) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
operator*( double dMul, const Point3d& ptP)
|
|
{
|
|
return Point3d( ptP.x * dMul, ptP.y * dMul, ptP.z * dMul) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Somma mediata di due punti (baricentrica)
|
|
//----------------------------------------------------------------------------
|
|
inline Point3d
|
|
Media( const Point3d& ptP1, const Point3d& ptP2, double dCoeff)
|
|
{
|
|
return Point3d( ( 1 - dCoeff) * ptP1.x + dCoeff * ptP2.x,
|
|
( 1 - dCoeff) * ptP1.y + dCoeff * ptP2.y,
|
|
( 1 - dCoeff) * ptP1.z + dCoeff * ptP2.z) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Quadrato della distanza tra due punti
|
|
//----------------------------------------------------------------------------
|
|
inline double
|
|
DistSq( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
double dX = ptP1.x - ptP2.x ;
|
|
double dY = ptP1.y - ptP2.y ;
|
|
double dZ = ptP1.z - ptP2.z ;
|
|
|
|
return ( dX * dX + dY * dY + dZ * dZ) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Distanza tra due punti
|
|
//----------------------------------------------------------------------------
|
|
inline double
|
|
Dist( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
double dX = ptP1.x - ptP2.x ;
|
|
double dY = ptP1.y - ptP2.y ;
|
|
double dZ = ptP1.z - ptP2.z ;
|
|
|
|
if ( fabs( dY) < EPS_ZERO && fabs( dZ) < EPS_ZERO)
|
|
return fabs( dX) ;
|
|
if ( fabs( dZ) < EPS_ZERO && fabs( dX) < EPS_ZERO)
|
|
return fabs( dY) ;
|
|
if ( fabs( dX) < EPS_ZERO && fabs( dY) < EPS_ZERO)
|
|
return fabs( dZ) ;
|
|
|
|
return sqrt( dX * dX + dY * dY + dZ * dZ) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Verifica che due punti sono quasi coincidenti (Small error -> Near)
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
AreSamePointNear( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
return ( DistSq( ptP1, ptP2) < ( EPS_SMALL * EPS_SMALL)) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Verifica che due punti sono esattamente coincidenti (Zero error -> Exact)
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
AreSamePointExact( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
return ( DistSq( ptP1, ptP2) < ( EPS_ZERO * EPS_ZERO)) ;
|
|
}
|