//---------------------------------------------------------------------------- // EgalTech 2015-2023 //---------------------------------------------------------------------------- // File : Voronoi.h Data : 23.11.23 Versione : 2.5k5 // Contenuto : Dichiarazione della classe Voronoi con libreria VRONI // // // // Modifiche : 23.11.23 SP Creazione modulo. // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkFrame3d.h" #include "/EgtDev/Include/EGkCurve.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkCurveLine.h" //---------------------------------------------------------------------------- static constexpr bool USE_VORONOI = true ; static constexpr int VORONOI_STD_BOUND = 3 ; static constexpr double VRONI_OFFS_TOL = 1e-9 ; static constexpr double VRONI_JUNCTION_OPEN = 1.0 ; static constexpr double VRONI_JUNCTION_CLOSED = 2.0 ; //-------------------------- Forward Definitions ------------------------------- class ISurfFlatRegion ; class vroniObject ; //---------------------------------------------------------------------------- class Voronoi { public : // costanti per il lato del medial axis enum WMATSide { WMAT_BOTHSIDES = 0, WMAT_LEFT = 1, WMAT_RIGHT = 2} ; public : Voronoi( void) : m_vroni( nullptr), m_nBound( VORONOI_STD_BOUND), m_bVDComputed( false), m_bAllowAdd( true) {} ; Voronoi( const ICurve* pCrv, bool bAllowAdd) ; Voronoi( const ISurfFlatRegion* pSfr, bool bAllowAdd) ; ~Voronoi( void) ; public : bool AddCurve( const ICurve* pCrv) ; bool AddSurfFlatRegion( const ISurfFlatRegion* pSfr) ; ICurve* GetCurve( int nId) const ; int GetCurveCount( void) const { return m_vpCrvs.size() ; } ; bool GetVroniPlane( Plane3d& plPlane) const ; bool CalcVoronoiDiagram( ICURVEPOVECTOR& vCrvs, int nBound = VORONOI_STD_BOUND) ; bool CalcOffset( ICURVEPOVECTOR& vOffs, double dOffs, int nType) ; bool CalcSingleCurvesOffset( ICURVEPOVECTOR& vOffs, double dOffs) ; bool CalcSpecialPointOffset( PNTVECTVECTOR& vResult, double dOffs) ; bool CalcFatCurve( ICURVEPOVECTOR& vOffs, double dOffs, bool bSquareEnds, bool bSquareMids, bool bMergeOnlySameProps = true) ; bool CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) ; bool CalcLimitOffset( int nCrv, bool bLeft, double& dOffs) ; bool Translate( const Vector3d& vtMove) ; bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg) ; bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) ; bool ToGlob( const Frame3d& frRef) ; bool ToLoc( const Frame3d& frRef) ; bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) ; private : bool Clear( void) ; bool IsValid( void) const { return m_vroni != nullptr ; } ; bool AddCurveToVroni( const ICurve * pCrv) ; bool AddLineToVroni( const ICurveLine* pLine, int& nVroniCrv, int nLoopId, int nCrvId = 0, Point3d ptForcedEnd = P_INVALID) ; bool AddArcToVroni( const ICurveArc* pArc, int& nVroniCrv, int nLoopId, int nCrvId = 0, Point3d ptForcedEnd = P_INVALID) ; bool AddCompoToVroni( const ICurveComposite* pCompo, int& nCrv, int nLoopId) ; bool AddBezierToVroni( const ICurveBezier* pBezier, int& nVroniCrv, int nLoopId) ; bool CalcVoronoi( int nBound = VORONOI_STD_BOUND) ; bool CalcVroniOffset( ICRVCOMPOPLIST& vOffs, double dOffs) ; bool UpdateVoronoi( double dOffs) ; ICRVCOMPOPOVECTOR AdjustOffsetCurves( const ICurveComposite* pCompo, double dOffs) const ; bool AdjustOffsetStart( ICurveComposite* pCompo) const ; int GetOffsetCurveSide( const ICurve* pCrv) const ; ICurve* GetBisectorCurve( int i) ; private : vroniObject* m_vroni ; // oggetto base della libreria vroni Frame3d m_Frame ; // frame in cui è espresso l'oggetto vroni int m_nBound ; // bound associato al diagramma di Voronoi corrente CICURVEPVECTOR m_vpCrvs ; // curve associate al Voronoi ( espresse rispetto a m_Frame) BBox3d m_bBox ; // box degli oggetti associati al Voronoi bool m_bVDComputed ; // indica se il diagramma di Voronoi è stato calcolato bool m_bAllowAdd ; // indica se possibile aggiungere altre curve/superifici dopo aver creato l'oggetto Voronoi } ;