f553fc3466
- aggiornamento.
85 lines
3.4 KiB
C++
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 ;
|
|
}
|