//---------------------------------------------------------------------------- // 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), dU( -1), dCurv( -1) {} } ; //---------------------------------------------------------------------------- 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 ( abs ( oDiffGp.dU - oDiffGs.dU) > EPS_PARAM || ! 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) || abs( oDiffGp.dCurv - oDiffGs.dCurv) > EPS_SMALL) { oDiffGp.nFlag = CrvPointDiffGeom::P1_DISC_NC ; oDiffGs.nFlag = CrvPointDiffGeom::P2_DISC_NC ; return true ; } return false ; }