63fb9a638b
- a SimpleOffset di Curve aggiunto parametro opzionale dMaxAngExt (angolo esterno oltre il quale estendi diventa smussa) con default 90deg.
98 lines
4.6 KiB
C++
98 lines
4.6 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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
|
|
} ;
|