Files
Include/EGkTriangle3d.h
T
Dario Sassi 04a9005246 Include :
- aggiornamento interfacce
- correzione macro di Logger.
2015-02-14 09:34:06 +00:00

96 lines
3.7 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2014-2015
//----------------------------------------------------------------------------
// File : EGkTria3d.h Data : 07.02.15 Versione : 1.6b2
// Contenuto : Dichiarazione classe triangolo Triangle3d.
//
//
//
// Modifiche : 30.03.14 DS Creazione modulo.
// 07.02.15 DS Agg. GetArea e GetAspectRatio.
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkPoint3d.h"
#include <algorithm>
//-----------------------------------------------------------------------------
class Triangle3d
{
public :
Triangle3d( void)
{}
void Set( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2)
{ ptP[0] = ptP0 ; ptP[1] = ptP1 ; ptP[2] = ptP2 ; vtN.Set( 0, 0, 0) ; }
void Set( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV)
{ ptP[0] = ptP0 ; ptP[1] = ptP1 ; ptP[2] = ptP2 ; vtN = vtV ; }
bool SetP( int nId, const Point3d& ptV)
{ if ( nId < 0 || nId >= 3)
return false ;
ptP[nId] = ptV ;
return true ;
}
bool Validate( void)
{ if ( AreSamePointApprox( ptP[0], ptP[1]) || AreSamePointApprox( ptP[0], ptP[2]))
return false ;
Vector3d vtV = ( ptP[1] - ptP[0]) ^ ( ptP[2] - ptP[0]) ;
vtV.Normalize() ;
if ( ! vtN.IsZero())
return AreSameVectorApprox( vtV, vtN) ;
vtN = vtV ;
return true ;
}
bool ToGlob( const Frame3d& frRef)
{ return ( ptP[0].ToGlob( frRef) && ptP[1].ToGlob( frRef) && ptP[2].ToGlob( frRef)) ; }
bool ToLoc( const Frame3d& frRef)
{ return ( ptP[0].ToLoc( frRef) && ptP[1].ToLoc( frRef) && ptP[2].ToLoc( frRef)) ; }
bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
{ return ( ptP[0].LocToLoc( frOri, frDest) &&
ptP[1].LocToLoc( frOri, frDest) &&
ptP[2].LocToLoc( frOri, frDest)) ; }
const Point3d& GetP( int nId) const
{ if ( nId >= 0 && nId < 3)
return ptP[nId] ;
else if ( nId < 0)
return ptP[0] ;
else
return ptP[2] ;
}
const Vector3d& GetN( void) const
{ return vtN ; }
double GetArea( void) const
{ return (( ptP[1] - ptP[0]) ^ ( ptP[2] - ptP[0])).Len() / 2 ; }
double GetAspectRatio( void) const
{ double dSqDistA = SqDist( ptP[0], ptP[1]) ;
double dSqDistB = SqDist( ptP[1], ptP[2]) ;
double dSqDistC = SqDist( ptP[2], ptP[0]) ;
double dTwoArea = (( ptP[1] - ptP[0]) ^ ( ptP[2] - ptP[0])).Len() ;
if ( dTwoArea < EPS_SMALL * EPS_SMALL)
return INFINITO ;
else
return ( std::max( dSqDistA, std::max( dSqDistB, dSqDistC)) / dTwoArea) ;
}
private :
Point3d ptP[3] ;
Vector3d vtN ;
} ;
//-----------------------------------------------------------------------------
// Flags indicanti se i lati sono parte del contorno di un poligono di più triangoli
class TriFlags3d
{
public :
bool bFlag[3] ;
} ;
//-----------------------------------------------------------------------------
// Normali sui vertici, ottenute mediando opportunamente coi triangoli vicini
class TriNormals3d
{
public :
Vector3d vtN[3] ;
} ;