Files
Include/EGkCurvePointDiffGeom.h
T
Dario Sassi f553fc3466 Include :
- aggiornamento.
2014-07-01 12:31:23 +00:00

85 lines
3.4 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : EgkCurvePointDiffGeom.h Data : 26.12.13 Versione : 1.4l4
// Contenuto : Tipi generali per calcoli geometrici.
//
//
//
// Modifiche : 26.12.13 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkPoint3d.h"
//----------------------------------------------------------------------------
// Oggetto Punto di curva con sua geometria differenziale
class CrvPointDiffGeom
{
public :
enum Status { NONE = 0x00, // non è definito alcunché
POS = 0x01, // è definito il punto
TANG = 0x03, // è definita la tangente (quindi anche il punto)
NCRV = 0x07} ; // è definita la normale/curvatura (quindi anche la tangente)
enum Flag { STD = 0x00, // punto standard
TO_VERIFY = 0x01, // punto da verificare (al confine tra due curve)
P1_DISC_TG = 0x02, // primo punto di una discontinuità della tangente
P2_DISC_TG = 0x04, // secondo punto di una discontinuità della tangente
P1_DISC_NC = 0x10, // primo punto di una discontinuità della normale/curvatura
P2_DISC_NC = 0x20} ; // secondo punto di una discontinuità della normale/curvatura
public :
Status nStatus ;
Flag nFlag ;
double dU ;
Point3d ptP ;
Vector3d vtT ;
Vector3d vtN ;
double dCurv ;
public :
CrvPointDiffGeom( void) { nStatus = NONE ; nFlag = STD ; }
} ;
//----------------------------------------------------------------------------
inline bool
ThereIsDiscontinuity( CrvPointDiffGeom& oDiffGp, CrvPointDiffGeom& oDiffGs)
{
// per default tutto continuo
oDiffGp.nFlag = CrvPointDiffGeom::STD ;
oDiffGs.nFlag = CrvPointDiffGeom::STD ;
// verifico che siano definiti i parametri e i punti
if ( ( oDiffGp.nStatus & CrvPointDiffGeom::POS) == 0 ||
( oDiffGs.nStatus & CrvPointDiffGeom::POS) == 0)
return false ;
// verifico che il parametro e i punti coincidano
if ( fabs ( oDiffGp.dU - oDiffGs.dU) > EPS_ZERO ||
! AreSamePointApprox( oDiffGp.ptP, oDiffGs.ptP))
return false ;
// verifico che siano definite le tangenti
if ( ( oDiffGp.nStatus & CrvPointDiffGeom::TANG) == 0 ||
( oDiffGs.nStatus & CrvPointDiffGeom::TANG) == 0)
return false ;
// verifico discontinuità sulle tangenti
if ( ! AreSameVectorApprox( oDiffGp.vtT, oDiffGs.vtT)) {
oDiffGp.nFlag = CrvPointDiffGeom::P1_DISC_TG ;
oDiffGs.nFlag = CrvPointDiffGeom::P2_DISC_TG ;
return true ;
}
// verifico che siano definite le normali/curvature
if ( ( oDiffGp.nStatus & CrvPointDiffGeom::NCRV) == 0 ||
( oDiffGs.nStatus & CrvPointDiffGeom::NCRV) == 0)
return false ;
// verifico discontinuità sulle normali/curvature
if ( ! AreSameVectorApprox( oDiffGp.vtN, oDiffGs.vtN) ||
fabs( oDiffGp.dCurv - oDiffGs.dCurv) > EPS_SMALL) {
oDiffGp.nFlag = CrvPointDiffGeom::P1_DISC_NC ;
oDiffGs.nFlag = CrvPointDiffGeom::P2_DISC_NC ;
return true ;
}
return false ;
}