Files
EgtGeomKernel/SurfBezier.h
T
Dario Sassi 2c6ebdadca EgtGeomKernel :
- correzioni, migliorie e d estensioni alle superfici di Bezier
- in Release cambiate opzioni di ottimizzazione da /Ox  a /O2.
2020-03-30 11:04:20 +00:00

166 lines
8.6 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2020-2020
//----------------------------------------------------------------------------
// File : SurfBezier.h Data : 22.03.20 Versione : 2.2c3
// Contenuto : Dichiarazione della classe Superficie Bezier.
//
//
//
// Modifiche : 22.03.20 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "ObjGraphicsMgr.h"
#include "DllMain.h"
#include "GeoObjRW.h"
#include "CurveBezier.h"
#include "SurfTriMesh.h"
#include "/EgtDev/Include/EGkSurfBezier.h"
#include "/EgtDev/Include/EGkGeoCollection.h"
//----------------------------------------------------------------------------
class SurfBezier : public ISurfBezier, public IGeoObjRW
{
public : // IGeoObj
~SurfBezier( void) override ;
SurfBezier* Clone( void) const override ;
GeoObjType GetType( void) const override ;
bool IsValid( void) const override
{ return ( m_nStatus == OK) ; }
const std::string& GetTitle( void) const override ;
bool Dump( std::string& sOut, bool bMM = true, const char* szNewLine = "\n") const override ;
bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ;
bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const override ;
bool Translate( const Vector3d& vtMove) override ;
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg) override
{ double dAngRad = dAngDeg * DEGTORAD ;
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) override ;
bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) override ;
bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) override ;
bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff) override ;
bool ToGlob( const Frame3d& frRef) override ;
bool ToLoc( const Frame3d& frRef) override ;
bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) override ;
void SetObjGraphics( IObjGraphics* pOGr) override
{ m_OGrMgr.SetObjGraphics( pOGr) ; }
IObjGraphics* GetObjGraphics( void) override
{ return m_OGrMgr.GetObjGraphics() ; }
const IObjGraphics* GetObjGraphics( void) const override
{ return m_OGrMgr.GetObjGraphics() ; }
void SetTempProp( int nProp) override
{ m_nTempProp = nProp ; }
int GetTempProp( void) const override
{ return m_nTempProp ; }
public : // ISurf
bool IsSimple( void) const override
{ return true ; }
bool IsClosed( void) const override
{ return false ; }
bool GetArea( double& dArea) const override ;
bool GetVolume( double& dVolume) const override
{ if ( &dVolume == nullptr)
return false ;
dVolume = 0 ;
return true ; }
bool GetCentroid( Point3d& ptCen) const override ;
bool Invert( void) override ;
public : // ISurfBezier
bool CopyFrom( const IGeoObj* pGObjSrc) override ;
bool Init( int nDegU, int nDegV, bool bIsRational) override ;
bool SetControlPoint( int nIndU, int nIndV, const Point3d& ptCtrl) override
{ return SetControlPoint( GetInd( nIndU, nIndV), ptCtrl) ; }
bool SetControlPoint( int nInd, const Point3d& ptCtrl) override ;
bool SetControlPoint( int nIndU, int nIndV, const Point3d& ptCtrl, double dW) override
{ return SetControlPoint( GetInd( nIndU, nIndV), ptCtrl, dW) ; }
bool SetControlPoint( int nInd, const Point3d& ptCtrl, double dW) override ;
bool GetInfo( int& nDegU, int& nDegV, bool& bIsRat, bool& bTrimmed) const override ;
const Point3d& GetControlPoint( int nIndU, int nIndV, bool* pbOk) const override
{ return GetControlPoint( GetInd( nIndU, nIndV), pbOk) ; }
const Point3d& GetControlPoint( int nInd, bool* pbOk) const override ;
double GetControlWeight( int nIndU, int nIndV, bool* pbOk) const override
{ return GetControlWeight( GetInd( nIndU, nIndV), pbOk) ; }
double GetControlWeight( int nInd, bool* pbOk) const override ;
bool IsAPoint( void) const override ;
bool GetPointD1D2( double dU, double dV, Point3d& ptPos,
Vector3d* pvtDerU = nullptr, Vector3d* pvtDerV = nullptr,
Vector3d* pvtDerUU = nullptr, Vector3d* pvtDerVV = nullptr, Vector3d* pvtDerUV = nullptr) const override ;
bool GetPointNrmD1D2( double dU, double dV, Point3d& ptPos, Vector3d& vtN,
Vector3d* pvtDerU = nullptr, Vector3d* pvtDerV = nullptr,
Vector3d* pvtDerUU = nullptr, Vector3d* pvtDerVV = nullptr, Vector3d* pvtDerUV = nullptr) const override ;
CurveBezier* GetCurveOnU( double dV) const override ;
CurveBezier* GetCurveOnV( double dU) const override ;
ICurve* GetLoop( int nLoop) const override ; // nLoop 0-based (1°esterno, successivi interni)
bool GetControlCurveOnU( int nIndV, PolyLine& plCtrlU) const override ;
bool GetControlCurveOnV( int nIndU, PolyLine& plCtrlV) const override ;
const ISurfTriMesh* GetAuxSurf( void) const override ;
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool Load( NgeReader& ngeIn) override ;
public :
SurfBezier( void) ;
SurfBezier( const SurfBezier& sbSrc)
{ if ( ! CopyFrom( sbSrc))
LOG_ERROR( GetEGkLogger(), "SurfBezier : copy constructor error") }
SurfBezier& operator =( const SurfBezier& sbSrc)
{ if ( ! CopyFrom( sbSrc))
LOG_ERROR( GetEGkLogger(), "SurfBezier : copy error")
return *this ; }
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
enum ParDir { ON_U = 1, ON_V = 2} ;
static const int MAXDEG = 11 ;
private :
bool CopyFrom( const SurfBezier& sbSrc) ;
bool Validate( void) ;
int GetInd( int nIndU, int nIndV) const
{ return ( nIndV * ( m_nDegU + 1) + nIndU) ; }
int GetIndU( int nInd) const
{ return ( nInd % ( m_nDegU + 1)) ; }
int GetIndV( int nInd) const
{ return ( nInd / ( m_nDegU + 1)) ; }
int GetDim( void) const
{ return ( m_nDegU + 1) * ( m_nDegV + 1) ; }
void ResetAuxSurf( void) const ;
int GetSteps( int nDeg, double dLen, int nQuality) const ;
bool GetCurveOnU( double dV, int nStep, PolyLine& plCrvU) const ;
bool GetCurveOnV( double dU, int nStep, PolyLine& plCrvV) const ;
double GetCurveOnUApproxLen( double dV) const ;
double GetCurveOnVApproxLen( double dU) const ;
private :
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
mutable SurfTriMesh* m_pSTM ; // superficie trimesh ausiliaria
Status m_nStatus ; // stato
int m_nDegU ; // grado in U
int m_nDegV ; // grado in V
bool m_bRat ; // flag di razionale/polinomiale
bool m_bTrimmed ; // flag per presenza regione di trim
PNTVECTOR m_vPtCtrl ; // vettore dei punti di controllo
DBLVECTOR m_vWeCtrl ; // vettore dei pesi di controllo
int m_nTempProp ; // proprietà temporanea
} ;
//-----------------------------------------------------------------------------
inline SurfBezier* CreateBasicSurfBezier( void)
{ return ( static_cast<SurfBezier*>( CreateGeoObj( SRF_BEZIER))) ; }
inline SurfBezier* CloneBasicSurfBezier( const IGeoObj* pGObj)
{ if ( pGObj == nullptr || pGObj->GetType() != SRF_BEZIER)
return nullptr ;
return ( static_cast<SurfBezier*>( pGObj->Clone())) ; }
inline const SurfBezier* GetBasicSurfBezier( const IGeoObj* pGObj)
{ return ( dynamic_cast<const SurfBezier*>( pGObj)) ; }
inline SurfBezier* GetBasicSurfBezier( IGeoObj* pGObj)
{ return ( dynamic_cast<SurfBezier*>( pGObj)) ; }