EgtGeomKernel :

- gestione traslazione, rotazione e cambi di frame per Voronoi
- aggiunta funzione per resettare Voronoi degli oggetti.
This commit is contained in:
SaraP
2024-03-15 16:03:51 +01:00
parent 5952eee22c
commit d253312139
13 changed files with 397 additions and 274 deletions
+55 -45
View File
@@ -189,7 +189,7 @@ CurveArc::Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d&
// calcolo del versore normale
m_VtN = vtA ^ vtB ;
double dNSqLen = m_VtN.SqLen() ;
// se i punti sono praticamente allineati non si può calcolare la circonferenza
// se i punti sono praticamente allineati non si può calcolare la circonferenza
if ( ! m_VtN.Normalize( EPS_ZERO))
return false ;
// calcolo del centro
@@ -216,17 +216,17 @@ CurveArc::Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d&
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, dAng2Deg, bDet2) || ! bDet2)
return false ;
// deduzione dell'angolo al centro
// se uno dei due angoli è nullo, errore
// se uno dei due angoli è nullo, errore
if ( abs( dAng1Deg) < EPS_ANG_SMALL || abs( dAng2Deg) < EPS_ANG_SMALL)
return false ;
// se i due angoli hanno lo stesso segno e Ang1 è minore di Ang2 in modulo
// se i due angoli hanno lo stesso segno e Ang1 è minore di Ang2 in modulo
else if ( dAng1Deg * dAng2Deg > 0 && abs( dAng1Deg) < abs( dAng2Deg))
m_dAngCenDeg = dAng2Deg ;
// altrimenti hanno segno opposto oppure Ang1 è maggiore di Ang2 in modulo
// altrimenti hanno segno opposto oppure Ang1 è maggiore di Ang2 in modulo
else
m_dAngCenDeg = - _copysign( ANG_FULL, dAng2Deg) + dAng2Deg ;
}
// non c'è DeltaN
// non c'è DeltaN
m_dDeltaN = 0 ;
// imposto ricalcolo di Voronoi
@@ -255,7 +255,7 @@ CurveArc::Set2PNB( const Point3d& ptIni, const Point3d& ptFin, const Vector3d& v
Vector3d vtDiff = ptFin - ptIni ;
if ( vtDiff.IsSmall())
return false ;
// deltaN eventuale ( è componente parallela a VtN)
// deltaN eventuale ( è componente parallela a VtN)
m_dDeltaN = vtDiff * m_VtN ;
vtDiff -= m_dDeltaN * m_VtN ;
if ( abs( m_dDeltaN) < EPS_SMALL)
@@ -304,7 +304,7 @@ CurveArc::Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStart
// calcolo del versore normale
m_VtN = vtA ^ vtB ;
double dNSqLen = m_VtN.SqLen() ;
// se tangente e punti sono praticamente allineati non si può calcolare la circonferenza
// se tangente e punti sono praticamente allineati non si può calcolare la circonferenza
if ( ! m_VtN.Normalize( EPS_ZERO))
return false ;
// calcolo del centro
@@ -321,7 +321,7 @@ CurveArc::Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStart
double dAng1Deg ;
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, dAng1Deg, bDet1) || ! bDet1)
return false ;
// poichè il senso di rotazione è sempre CCW, se l'angolo è negativo prendo il suo complemento al giro
// poichè il senso di rotazione è sempre CCW, se l'angolo è negativo prendo il suo complemento al giro
if ( dAng1Deg < 0)
m_dAngCenDeg = ANG_FULL + dAng1Deg ;
else
@@ -414,7 +414,7 @@ CurveArc::Set2PRS( const Point3d& ptStart, const Point3d& ptEnd, double dRad, bo
bool bDet ;
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, m_dAngCenDeg, bDet) || ! bDet)
return false ;
// quando è 180deg il segno è determinato solo dal senso
// quando è 180deg il segno è determinato solo dal senso
if ( abs( m_dAngCenDeg - ANG_STRAIGHT) < 10 * EPS_ANG_SMALL &&
( ( bCCW && m_dAngCenDeg < 0) ||
( ! bCCW && m_dAngCenDeg > 0)))
@@ -529,7 +529,7 @@ CurveArc::SetC2P( const Point3d& ptCen, const Point3d& ptStart, const Point3d& p
if ( m_dRad < EPS_ZERO)
return false ;
m_VtS /= m_dRad ;
// calcolo l'angolo al centro (la funzione trova sempre il più piccolo)
// calcolo l'angolo al centro (la funzione trova sempre il più piccolo)
bool bDet ;
if ( ! m_VtS.GetRotation( ( ptNearEnd - m_PtCen), m_VtN, m_dAngCenDeg, bDet) || ! bDet)
return false ;
@@ -733,7 +733,7 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// assegno il box nel riferimento
@@ -820,7 +820,7 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
}
}
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Vector3d vtFrExtr = m_VtExtr ;
vtFrExtr.ToGlob( frRef) ;
@@ -838,7 +838,7 @@ bool
CurveArc::Validate( void)
{
if ( m_nStatus == TO_VERIFY) {
// limito l'angolo al centro a un giro se è piatto ( non è elica)
// limito l'angolo al centro a un giro se è piatto ( non è elica)
if ( abs( m_dDeltaN) < EPS_SMALL) {
if ( m_dAngCenDeg > ANG_FULL)
m_dAngCenDeg = ANG_FULL ;
@@ -1167,7 +1167,7 @@ CurveArc::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLin
return false ;
}
// se necessario, sistemo per convessità dalla parte ammessa
// se necessario, sistemo per convessità dalla parte ammessa
if ( nType == APL_RIGHT_CONVEX || nType == APL_LEFT_CONVEX) {
if ( ! PL.MakeConvex( vtExtr, ( nType == APL_LEFT_CONVEX)))
return false ;
@@ -1241,7 +1241,7 @@ CurveArc::CopyParamRange( double dUStart, double dUEnd) const
return nullptr ;
// se il parametro start supera quello di end
if ( dUStart > dUEnd - EPS_PARAM) {
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
if ( ! IsClosed())
return nullptr ;
// se curva chiusa, il trim si avvolge attorno al punto di giunzione
@@ -1331,7 +1331,7 @@ bool
CurveArc::MyExtendedOffset( double dDist, bool bAll, int nType)
{
// bAll == true fa accettare raggi nulli ==> da usare solo internamente
// quando si è sicuri di aumentare subito il raggio o di cancellare
// quando si è sicuri di aumentare subito il raggio o di cancellare
// la curva deve essere validata
if ( m_nStatus != OK)
@@ -1409,7 +1409,7 @@ CurveArc::ModifyEnd( const Point3d& ptNewEnd)
ptOldEndIntr.ToLoc( frIntr) ;
Point3d ptEndIntr = ptNewEnd ;
ptEndIntr.ToLoc( frIntr) ;
// se coincidono nel piano XY, è cambiato solo il deltaN
// se coincidono nel piano XY, è cambiato solo il deltaN
if ( AreSamePointXYExact( ptOldEndIntr, ptEndIntr)) {
m_dDeltaN += ptEndIntr.z - ptOldEndIntr.z ;
}
@@ -1615,8 +1615,10 @@ CurveArc::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1634,12 +1636,14 @@ CurveArc::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, dou
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1787,7 +1791,7 @@ CurveArc::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -1815,11 +1819,11 @@ CurveArc::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vt
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
// possibile solo se l'arco è piatto e il piano di scorrimento coincide con quello dell'arco
// possibile solo se l'arco è piatto e il piano di scorrimento coincide con quello dell'arco
if ( ! ( abs( m_dDeltaN) < EPS_SMALL) ||
! AreSameOrOppositeVectorExact( m_VtN, vtNorm))
return false ;
@@ -1849,16 +1853,18 @@ CurveArc::ToGlob( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1876,16 +1882,18 @@ CurveArc::ToLoc( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1903,16 +1911,18 @@ CurveArc::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1989,12 +1999,12 @@ CurveArc::MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, doub
// verifica posizione punto su arco
nPos = PP_NULL ; // fuori
if ( abs( DiffAngle( dAngDeg, 0) * DEGTORAD * m_dRad) < dLinTol) {
nPos = ( IsACircle() ? PP_MID : PP_START) ; // se cerchio è interno, altrimenti vicino a inizio
nPos = ( IsACircle() ? PP_MID : PP_START) ; // se cerchio è interno, altrimenti vicino a inizio
dU = AngleNearAngle( dAngDeg, 0) / m_dAngCenDeg ;
dU = max( dU, 0.) ;
}
else if ( abs( DiffAngle( dAngDeg, m_dAngCenDeg) * DEGTORAD * m_dRad) < dLinTol) {
nPos = ( IsACircle() ? PP_MID : PP_END) ; // se cerchio è interno, altrimenti vicino a fine
nPos = ( IsACircle() ? PP_MID : PP_END) ; // se cerchio è interno, altrimenti vicino a fine
dU = AngleNearAngle( dAngDeg, m_dAngCenDeg) / m_dAngCenDeg ;
dU = min( dU, 1.) ;
}
@@ -2011,7 +2021,7 @@ CurveArc::ChangeRadius( double dNewRadius)
if ( m_nStatus != OK)
return false ;
// verifico validità del raggio
// verifico validità del raggio
if ( ! ( dNewRadius > EPS_SMALL && dNewRadius < MAX_ARC_RAD))
return false ;
@@ -2057,7 +2067,7 @@ CurveArc::ChangeAngCenter( double dNewAngCenDeg)
if ( m_nStatus != OK)
return false ;
// verifico accettabilità angolo
// verifico accettabilità angolo
if ( ! ( abs( m_dAngCenDeg) > EPS_ANG_ZERO))
return false ;
@@ -2153,11 +2163,11 @@ CurveArc::Flip( void)
//----------------------------------------------------------------------------
// Oggetto locale per approssimazione di archi
// Approx interna è quella cordale standard.
// Approx esterna è quella tangente a inizio e fine con metà tratto e un punto in più.
// Approx interna è quella cordale standard.
// Approx esterna è quella tangente a inizio e fine con metà tratto e un punto in più.
// I punti si calcolano a partire dal triangolo tra due punti consecutivi interni e il centro,
// usando il versore medio dal centro e moltiplicandolo per il coefficiente ( 2 / ( 1 + cosA)).
// Il versore dell'ultimo punto è già stato calcolato per il penultimo.
// Il versore dell'ultimo punto è già stato calcolato per il penultimo.
//----------------------------------------------------------------------------
ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const CurveArc& arArc)
{
@@ -2281,7 +2291,7 @@ CurveArc::GetVoronoiObject() const
if ( m_nStatus != OK)
return nullptr ;
// se non è stato calcolato, lo calcolo
// se non è stato calcolato, lo calcolo
if ( m_pVoronoiObj == nullptr)
CalcVoronoiObject() ;
+2 -2
View File
@@ -203,13 +203,13 @@ class CurveArc : public ICurveArc, public IGeoObjRW
bool MyExtendedOffset( double dDist, bool bAll, int nType = OFF_FILLET) ;
bool MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, double dLinTol) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveArc& caSrc) ;
bool Validate( void) ;
bool GetDir( double dU, Vector3d& vtDir) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -225,7 +225,7 @@ class CurveArc : public ICurveArc, public IGeoObjRW
double m_dDeltaN ; // variazione di quota lungo VtN della fine rispetto all'inizio
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+49 -30
View File
@@ -2,7 +2,7 @@
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : CurveAux.cpp Data : 22.11.13 Versione : 1.3a1
// Contenuto : Implementazione di alcune funzioni di utilità per le curve.
// Contenuto : Implementazione di alcune funzioni di utilità per le curve.
//
//
//
@@ -39,7 +39,7 @@ IsClosed( const ICurve& crvC)
bool
IsValidParam( const ICurve& crvC, double dPar, ICurve::Side nSide)
{
// recupero l'intervallo di validità del parametro
// recupero l'intervallo di validità del parametro
double dStart, dEnd ;
if ( ! crvC.GetDomain( dStart, dEnd))
return false ;
@@ -60,11 +60,11 @@ IsValidParam( const ICurve& crvC, double dPar, ICurve::Side nSide)
bool
IsStartParam( const ICurve& crvC, double dPar)
{
// recupero l'intervallo di validità del parametro
// recupero l'intervallo di validità del parametro
double dStart, dEnd ;
if ( ! crvC.GetDomain( dStart, dEnd))
return false ;
// se il parametro non è nell'intorno dell'inizio
// se il parametro non è nell'intorno dell'inizio
if ( abs( dPar - dStart) > EPS_PARAM)
return false ;
return true ;
@@ -74,11 +74,11 @@ IsStartParam( const ICurve& crvC, double dPar)
bool
IsEndParam( const ICurve& crvC, double dPar)
{
// recupero l'intervallo di validità del parametro
// recupero l'intervallo di validità del parametro
double dStart, dEnd ;
if ( ! crvC.GetDomain( dStart, dEnd))
return false ;
// se il parametro non è nell'intorno della fine
// se il parametro non è nell'intorno della fine
if ( abs( dPar - dEnd) > EPS_PARAM)
return false ;
return true ;
@@ -98,7 +98,7 @@ GetNearestExtremityToPoint( const Point3d& ptP, const ICurve& Curve, bool& bStar
return false ;
// se curva aperta
if ( ! AreSamePointApprox( ptStart, ptEnd)) {
// è il più vicino tra inizio e fine
// è il più vicino tra inizio e fine
bStart = ( SqDist( ptP, ptStart) <= SqDist( ptP, ptEnd)) ;
return true ;
}
@@ -186,7 +186,7 @@ GetPointTang( const ICurve& crvC, double dU, ICurve::Side nS, Point3d& ptPos, Ve
return false ;
double dUmod = dU + ( nS == ICurve::FROM_MINUS ? -1 : +1) * 100 * EPS_PARAM ;
Point3d ptDummy ;
// se anche la derivata seconda è nulla, provo a spostarmi di poco
// se anche la derivata seconda è nulla, provo a spostarmi di poco
if ( ! vtTang.Normalize( EPS_ZERO)) {
if ( ! crvC.GetPointD1D2( dUmod, nS, ptDummy, &vtDummy, &vtTang))
return false ;
@@ -263,14 +263,14 @@ GetPointDiffGeom( const ICurve& crvC, double dU, ICurve::Side nS, CrvPointDiffGe
bool
ImproveCurveParamAtPoint( double& dU, const Point3d& ptP, const ICurve* pCrv)
{
// Da usare quando il parametro è già molto vicino a quello esatto
// Da usare quando il parametro è già molto vicino a quello esatto
// calcolo il punto della curva in corrispondenza al parametro
Point3d ptQ ;
Vector3d vtD ;
if ( ! pCrv->GetPointD1D2( dU, ICurve::FROM_MINUS, ptQ, &vtD))
return false ;
// se sono uguali, è già tutto ok
// se sono uguali, è già tutto ok
if ( AreSamePointExact( ptP, ptQ))
return true ;
// se derivata nulla, non posso migliorare
@@ -332,7 +332,7 @@ CurveGetArea( const ICurve& crvC, Plane3d& plPlane, double& dArea)
bool
CurveDump( const ICurve& crvC, string& sOut, bool bMM, const char* szNewLine)
{
// verifico validità curva
// verifico validità curva
if ( ! crvC.IsValid())
return false ;
@@ -455,7 +455,7 @@ ArcToBezierCurve( const ICurve* pCrv)
ICurve*
CurveToNoArcsCurve( const ICurve* pCrv)
{
// verifico validità curva
// verifico validità curva
if ( pCrv == nullptr)
return nullptr ;
// se arco, devo trasformarlo in curva di Bezier (semplice o composta)
@@ -479,7 +479,7 @@ CurveToNoArcsCurve( const ICurve* pCrv)
ICurve*
CurveToArcsPerpExtrCurve( const ICurve* pCrv, double dLinTol, double dAngTolDeg)
{
// verifico validità curva
// verifico validità curva
if ( pCrv == nullptr)
return nullptr ;
// se arco in piano non perpendicolare ad estrusione, curva composita o curva di Bezier trasformo
@@ -525,13 +525,13 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
// se periodica
if ( cnData.bPeriodic || ! cnData.bClamped) {
// va trasformata in non-periodica (clamped)
// bisogna aumentare la molteplicità dei nodi u_p-1 e u_(m-p+1) fino ad arrivare al grado della nurbs
// bisogna aumentare la molteplicità dei nodi u_p-1 e u_(m-p+1) fino ad arrivare al grado della nurbs
// e poi scartare nodi e punti fuori dalla regione clamped ( al di fuori della regione u_p-1 -> u_(m-p+1))
// l'agoritmo per l'inserimento dei nodi l' A5.1 del libro delle Nurbs ( Piegl e Tiller), con qualche modifica
// agli indici perché uso u_p-1 e u_(m-p+1), anziché u_p e u_m-p
// agli indici perché uso u_p-1 e u_(m-p+1), anziché u_p e u_m-p
// comincio ad aumentare la molteplictià del nodo u_m-p+1
// comincio ad aumentare la molteplictià del nodo u_m-p+1
int nCP = int( cnData.vCP.size()) ;
int nU = nCP + cnData.nDeg - 1 ;
int nDeg = cnData.nDeg ;
@@ -540,12 +540,12 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
DBLVECTOR vBW ;
vBW.resize( nDeg + 1) ;
// trovo il nodo di cui aumentare la molteplicità e ne calcolo la molteplicità
// trovo il nodo di cui aumentare la molteplicità e ne calcolo la molteplicità
int b = nU - nDeg - 1 + 1 ;
int i = b ;
while ( b > 0 && abs( cnData.vU[b] - cnData.vU[b - 1]) < EPS_ZERO)
-- b ;
int mult = min( i - b + 1, nDeg) ; // mi aspetto che sia 1, ma comunque sarà < nDeg
int mult = min( i - b + 1, nDeg) ; // mi aspetto che sia 1, ma comunque sarà < nDeg
// recupero i punti da modificare
if ( ! cnData.bRat) {
for ( int i = 0 ; i <= nDeg - mult ; ++ i)
@@ -559,7 +559,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
}
// salvo i punti inalterati
int r = nDeg - mult ; // numero di volte che dovrò inserire il nodo
int r = nDeg - mult ; // numero di volte che dovrò inserire il nodo
cnData.vCP.resize( nCP + r) ;
for ( int p = nCP - 1 ; p > b - mult ; --p) {
cnData.vCP[r + p] = cnData.vCP[p] ;
@@ -604,12 +604,12 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
nU = nU + r ;
nCP = nCP + r ;
// aumento la molteplicità del punto u_p-1
// aumento la molteplicità del punto u_p-1
b = nDeg - 1 ;
i = b ;
while ( b > 0 && abs( cnData.vU[b] - cnData.vU[b - 1]) < EPS_ZERO)
-- b ;
mult = min( i - b + 1, nDeg) ; // mi aspetto che sia 1, ma comunque sarà < cnData.nDeg
mult = min( i - b + 1, nDeg) ; // mi aspetto che sia 1, ma comunque sarà < cnData.nDeg
// recupero i punti da modificare
if ( ! cnData.bRat) {
for ( int i = 0 ; i <= nDeg - mult ; ++ i)
@@ -719,7 +719,7 @@ NurbsToBezierCurve( const CNurbsData& cnData)
if ( ! bOk)
return nullptr ;
// se 1 solo intervallo, la Nurbs è già una curva di Bezier
// se 1 solo intervallo, la Nurbs è già una curva di Bezier
if ( nInt == 1) {
// creo la curva di Bezier
PtrOwner<CurveBezier> pCrvBez( CreateBasicCurveBezier()) ;
@@ -738,14 +738,14 @@ NurbsToBezierCurve( const CNurbsData& cnData)
return nullptr ;
}
}
// se non è una curva ma un punto, la invalido
// se non è una curva ma un punto, la invalido
if ( pCrvBez->IsAPoint())
pCrvBez->Init( cnData.nDeg, cnData.bRat) ;
// restituisco la curva
return Release( pCrvBez) ;
}
// altrimenti è equivalente ad una curva composita, la creo
// altrimenti è equivalente ad una curva composita, la creo
PtrOwner<CurveComposite> pCrvCompo( CreateBasicCurveComposite()) ;
if ( IsNull( pCrvCompo))
return nullptr ;
@@ -813,7 +813,7 @@ NurbsToBezierCurve( const CNurbsData& cnData)
return nullptr ;
// se precedente saltata
if ( bPrevRejected) {
// prendo l'ultimo punto della curva composita per garantire la continuità
// prendo l'ultimo punto della curva composita per garantire la continuità
Point3d ptEnd ;
if ( pCrvCompo->GetEndPoint( ptEnd))
vBC[0] = ptEnd ;
@@ -833,13 +833,13 @@ NurbsToBezierCurve( const CNurbsData& cnData)
return nullptr ;
}
}
// se è una vera curva, la aggiungo alla curva composita
// se è una vera curva, la aggiungo alla curva composita
if ( ! pCrvBez->IsAPoint()) {
if ( ! pCrvCompo->AddCurve( Release( pCrvBez)))
return nullptr ;
bPrevRejected = false ;
}
// altrimenti è un punto, la cancello
// altrimenti è un punto, la cancello
else {
pCrvBez.Reset() ;
bPrevRejected = true ;
@@ -911,7 +911,7 @@ FlattenCurve( const ICurve& crCrv, double dToler, double dAngToler, int nFlag)
Point3d ptCen ;
if ( ! crCrv.GetCentroid( ptCen))
return nullptr ;
// Verifico se curva già piatta
// Verifico se curva già piatta
PolyLine PL ;
if ( ! crCrv.ApproxWithLines( LIN_TOL_FINE, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL_INT, PL))
return nullptr ;
@@ -924,7 +924,7 @@ FlattenCurve( const ICurve& crCrv, double dToler, double dAngToler, int nFlag)
bFlat = false ;
bPoint = PL.GetNextPoint( ptP) ;
}
// Se curva già piatta, la copio ed esco
// Se curva già piatta, la copio ed esco
if ( bFlat) {
PtrOwner<ICurve> pCrv( crCrv.Clone()) ;
if ( IsNull( pCrv))
@@ -975,7 +975,7 @@ ProjectCurveOnPlane( const ICurve& crCrv, const Plane3d& plPlane)
// determino se curva piana e suo eventuale piano
Plane3d plCrv ;
if ( crCrv.IsFlat( plCrv, false, EPS_SMALL / 2)) {
// se il piano della curva è parallelo a quello di proiezione
// se il piano della curva è parallelo a quello di proiezione
if ( AreSameOrOppositeVectorExact( plCrv.GetVersN(), plPlane.GetVersN())) {
// copio la curva
PtrOwner<ICurve> pCrv( crCrv.Clone()) ;
@@ -1087,3 +1087,22 @@ CalcCurveFatCurve( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dRadius, bo
return pVoronoiObj->CalcFatCurve( vCrvs, dRadius, bSquareEnds, bSquareMids) ;
}
//----------------------------------------------------------------------------
void
ResetCurveVoronoi( const ICurve& crvC)
{
switch ( crvC.GetType()) {
case CRV_LINE :
GetBasicCurveLine( &crvC)->ResetVoronoiObject() ;
break ;
case CRV_ARC :
GetBasicCurveArc( &crvC)->ResetVoronoiObject() ;
break ;
case CRV_BEZIER :
GetBasicCurveBezier( &crvC)->ResetVoronoiObject() ;
break ;
case CRV_COMPO :
GetBasicCurveComposite( &crvC)->ResetVoronoiObject() ;
break ;
}
}
+20 -10
View File
@@ -1873,8 +1873,10 @@ CurveBezier::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1897,8 +1899,10 @@ CurveBezier::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng,
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2032,8 +2036,10 @@ CurveBezier::ToGlob( const Frame3d& frRef)
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2061,8 +2067,10 @@ CurveBezier::ToLoc( const Frame3d& frRef)
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2090,8 +2098,10 @@ CurveBezier::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
+4 -4
View File
@@ -117,7 +117,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
ICurve* CopyParamRange( double dUStart, double dUEnd) const override ;
bool Invert( void) override ;
bool SimpleOffset( double dDist, int nType = OFF_FILLET) override
{ return false ; } // l'offset di crvBezier non è crvBezier tranne in casi molto particolari
{ return false ; } // l'offset di crvBezier non è crvBezier tranne in casi molto particolari
bool ModifyStart( const Point3d& ptNewStart) override ;
bool ModifyEnd( const Point3d& ptNewEnd) override ;
bool SetExtrusion( const Vector3d& vtExtr) override
@@ -168,6 +168,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
bool ApproxWithLines( int nStep, PolyLine& PL) const ;
bool GetApproxLength( double& dLen) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveBezier& cbSrc) ;
@@ -186,7 +187,6 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
bool ToPowerBase( PolynomialPoint3d& pol3P) const ;
bool ToPowerBase( PolynomialPoint3d& pol3Num, Polynomial& polDen) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -197,12 +197,12 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
Status m_nStatus ; // stato
int m_nDeg ; // grado
bool m_bRat ; // flag di razionale/polinomiale
mutable double m_dParSing ; // eventuale parametro della singolarità (-1=no, -2=da calcolare)
mutable double m_dParSing ; // eventuale parametro della singolarità (-1=no, -2=da calcolare)
PNTVECTOR m_vPtCtrl ; // vettore dei punti di controllo
DBLVECTOR m_vWeCtrl ; // vettore dei pesi di controllo
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+115 -105
View File
@@ -186,7 +186,7 @@ CurveComposite::AddCurveByRelocate( CurveComposite& ccSrc, bool bEndOrStart, dou
bool
CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinTol)
{
// prendo la proprietà del puntatore
// prendo la proprietà del puntatore
PtrOwner<ICurve> pCrv( pSmplCrv) ;
if ( IsNull( pCrv))
return false ;
@@ -211,15 +211,15 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT
if ( ! pCrv->GetStartPoint( ptCrvStart) || ! pCrv->GetEndPoint( ptCrvEnd))
return false ;
// se non è la prima
// se non è la prima
if ( ! m_CrvSmplS.empty()) {
// se inserita alla fine
if ( bEndOrStart) {
// verifico sia in continuità con il finale attuale
// verifico sia in continuità con il finale attuale
Point3d ptEnd ;
GetEndPoint( ptEnd) ;
if ( ! AreSamePointEpsilon( ptCrvStart, ptEnd, EPS_CONNECT)) {
// se in tolleranza, modifico l'inizio dell'entità
// se in tolleranza, modifico l'inizio dell'entità
if ( SqDist( ptCrvStart, ptEnd) < ( dLinTol * dLinTol)) {
// lunghezza della curva originale
double dOldLen ; pCrv->GetLength( dOldLen) ;
@@ -237,11 +237,11 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT
}
// altrimenti inserita all'inizio
else {
// verifico sia in continuità con l'iniziale attuale
// verifico sia in continuità con l'iniziale attuale
Point3d ptStart ;
GetStartPoint( ptStart) ;
if ( ! AreSamePointEpsilon( ptCrvEnd, ptStart, EPS_CONNECT)) {
// se in tolleranza, modifico la fine dell'entità
// se in tolleranza, modifico la fine dell'entità
if ( SqDist( ptCrvEnd, ptStart) < ( dLinTol * dLinTol)) {
// lunghezza della curva originale
double dOldLen ; pCrv->GetLength( dOldLen) ;
@@ -286,7 +286,7 @@ CurveComposite::Close( void)
if ( ! GetStartPoint( ptStart) ||
! GetEndPoint( ptEnd))
return false ;
// se distanza inferiore al limite ridotto, non faccio alcunché
// se distanza inferiore al limite ridotto, non faccio alcunché
if ( AreSamePointEpsilon( ptStart, ptEnd, EPS_CONNECT))
return true ;
// se molto vicini li modifico
@@ -324,7 +324,7 @@ CurveComposite::FromSplit( const ICurve& cCrv, int nParts)
if ( ! cCrv.IsValid() || ! cCrv.IsSimple())
return false ;
// se 1 parte o meno, non fa alcunchè
// se 1 parte o meno, non fa alcunchè
if ( nParts <= 1)
return true ;
@@ -565,11 +565,11 @@ CurveComposite::Clone( void) const
bool
CurveComposite::CopyFrom( const IGeoObj* pGObjSrc)
{
// se sorgente è una curva composita
// se sorgente è una curva composita
const CurveComposite* pCC = GetBasicCurveComposite( pGObjSrc) ;
if ( pCC != nullptr)
return CopyFrom( *pCC) ;
// se sorgente è un'altro tipo di curva
// se sorgente è un'altro tipo di curva
const ICurve* pCrv = ::GetCurve( pGObjSrc) ;
if ( pCrv != nullptr) {
Clear() ;
@@ -782,7 +782,7 @@ CurveComposite::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
// passo alla curva successiva
pCrvSmpl = GetNextCurve() ;
}
// se c'è estrusione, devo tenerne conto (curve componenti sempre con vtExtr e dThick nulli)
// se c'è estrusione, devo tenerne conto (curve componenti sempre con vtExtr e dThick nulli)
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Point3d ptMinExtr = b3Loc.GetMin() + m_VtExtr * m_dThick ;
Point3d ptMaxExtr = b3Loc.GetMax() + m_VtExtr * m_dThick ;
@@ -799,7 +799,7 @@ CurveComposite::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// inizializzo il box
@@ -816,7 +816,7 @@ CurveComposite::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// passo alla curva successiva
pCrvSmpl = GetNextCurve() ;
}
// se c'è estrusione, devo tenerne conto (curve componenti sempre con vtExtr e dThick nulli)
// se c'è estrusione, devo tenerne conto (curve componenti sempre con vtExtr e dThick nulli)
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Vector3d vtFrExtr = m_VtExtr ;
vtFrExtr.ToGlob( frRef) ;
@@ -838,14 +838,14 @@ CurveComposite::Validate( void)
// ciclo su tutte le curve
int nCount = 0 ;
for ( auto Iter = m_CrvSmplS.cbegin() ; Iter != m_CrvSmplS.cend() ; ++Iter) {
// verifico validità della curva e sua semplicità
// verifico validità della curva e sua semplicità
if ( ! (*Iter)->IsValid() || (*Iter)->GetType() == CRV_COMPO) {
m_nStatus = ERR ;
return false ;
}
// incremento contatore
++ nCount ;
// verifico continuità con la precedente (se non è la prima)
// verifico continuità con la precedente (se non è la prima)
if ( nCount > 1) {
(*Iter)->GetStartPoint( ptStart) ;
if ( ! AreSamePointApprox( ptPrevEnd, ptStart)) {
@@ -870,7 +870,7 @@ CurveComposite::Validate( void)
bool
CurveComposite::TestClosure( void)
{
// se non è chiusa, esco subito
// se non è chiusa, esco subito
if ( ! IsClosed())
return true ;
// verifico ed eventualmente aggiusto coincidenza punti estremi
@@ -939,7 +939,7 @@ CurveComposite::IsFlat( Plane3d& plPlane, bool bUseExtrusion, double dToler) con
} break ;
}
}
// recupero dati sulla planarità della polilinea
// recupero dati sulla planarità della polilinea
int nRank ;
Point3d ptCen ;
Vector3d vtDir ;
@@ -1022,7 +1022,7 @@ CurveComposite::GetMidPoint( Point3d& ptMid) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// determino il valore del parametro a metà lunghezza
// determino il valore del parametro a metà lunghezza
double dLen, dMid ;
if ( ! GetLength( dLen) || ! GetParamAtLength( 0.5 * dLen, dMid))
return false ;
@@ -1083,7 +1083,7 @@ CurveComposite::GetMidDir( Vector3d& vtDir) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// determino il valore del parametro a metà lunghezza
// determino il valore del parametro a metà lunghezza
double dLen, dMid ;
if ( ! GetLength( dLen) || ! GetParamAtLength( 0.5 * dLen, dMid))
return false ;
@@ -1363,7 +1363,7 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P
dLinTol = max( dLinTol, LIN_TOL_MIN) ;
dAngTolDeg = max( dAngTolDeg, ANG_TOL_MIN_DEG) ;
// se speciale, approssimo ogni singola entità e conservo le estremità interne (joint)
// se speciale, approssimo ogni singola entità e conservo le estremità interne (joint)
if ( nType == APL_SPECIAL || nType == APL_SPECIAL_INT) {
// eseguo approssimazione
double dStartPar = 0 ;
@@ -1409,7 +1409,7 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P
Vector3d vtExtr = ( m_VtExtr.IsSmall() ? Z_AX : m_VtExtr) ;
if ( ! PL.ApproxOnSide( vtExtr, ( nType == APL_LEFT || nType == APL_LEFT_CONVEX), dLinTol))
return false ;
// se necessario, sistemo per convessità dalla parte ammessa
// se necessario, sistemo per convessità dalla parte ammessa
if ( nType == APL_RIGHT_CONVEX || nType == APL_LEFT_CONVEX) {
if ( ! PL.MakeConvex( vtExtr, ( nType == APL_LEFT_CONVEX)))
return false ;
@@ -1418,7 +1418,7 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P
}
// altrimenti standard
// prima approssimazione lineare a 10 * Epsilon di ogni singola entità
// prima approssimazione lineare a 10 * Epsilon di ogni singola entità
if ( ! ApproxWithLines( 10 * EPS_SMALL, dAngTolDeg, APL_SPECIAL, PL))
return false ;
// eliminazione dei punti in tolleranza
@@ -1436,7 +1436,7 @@ CurveComposite::ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA)
if ( m_nStatus != OK)
return false ;
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
Frame3d frNat ;
if ( ! m_VtExtr.IsSmall()) {
frNat.Set( ORIG, m_VtExtr) ;
@@ -1500,7 +1500,7 @@ CurveComposite::ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLin
double dMlStartPar = 0 ;
CurveByApprox crvByApprox ;
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
// determino riferimento naturale della curva in base all'estrusione o al piano medio se questa è nulla
Frame3d frNat ;
if ( ! m_VtExtr.IsSmall()) {
frNat.Set( ORIG, m_VtExtr) ;
@@ -1617,12 +1617,12 @@ CurveComposite::CopyParamRange( double dUStart, double dUEnd) const
if ( dUStart < - EPS_PARAM || dUStart > dMaxU + EPS_PARAM ||
dUEnd < - EPS_PARAM || dUEnd > dMaxU + EPS_PARAM)
return nullptr ;
// se i parametri coincidono, non resta alcunchè
// se i parametri coincidono, non resta alcunchè
if ( abs( dUEnd - dUStart) < EPS_PARAM)
return nullptr ;
// se il parametro start supera quello di end
if ( dUStart > dUEnd - EPS_PARAM) {
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
if ( ! IsClosed())
return nullptr ;
// se curva chiusa, il trim si avvolge attorno al punto di giunzione
@@ -1681,7 +1681,7 @@ CurveComposite::Invert( void)
bool
CurveComposite::SimpleOffset( double dDist, int nType)
{
// se distanza di offset nulla, non devo fare alcunché
// se distanza di offset nulla, non devo fare alcunché
if ( abs( dDist) < EPS_SMALL)
return true ;
@@ -1842,7 +1842,7 @@ CurveComposite::AddArcTg( const Point3d& ptNew, bool bEndOrStart)
return false ;
// recupero il versore normale al piano ( estrusione oppure se nulla asse Z locale)
Vector3d vtN = ( m_VtExtr.IsSmall() ? Z_AX : m_VtExtr) ;
// costruisco l'arco (in casi articolari può essere una linea)
// costruisco l'arco (in casi articolari può essere una linea)
PtrOwner<ICurve> pCrv ;
// se da aggiungere alla fine
if ( bEndOrStart) {
@@ -1875,7 +1875,7 @@ CurveComposite::AddArc2P( const Point3d& ptOther, const Point3d& ptNew, bool bEn
// verifico lo stato
if ( m_nStatus != OK && m_nStatus != TO_VERIFY)
return false ;
// costruisco l'arco (in casi articolari può essere una linea)
// costruisco l'arco (in casi articolari può essere una linea)
PtrOwner<ICurve> pCrv ;
// se da aggiungere alla fine
if ( bEndOrStart) {
@@ -1917,7 +1917,7 @@ CurveComposite::AddJoint( double dU)
if ( IsNull( pCrv1) || IsNull( pCrv2))
return false ;
// della prima curva tengo la parte dall'inizio al parametro, della seconda la rimanente
// ( se non riesco a trimmare, la nuova giunzione coincide con una già esistente, esco con successo)
// ( se non riesco a trimmare, la nuova giunzione coincide con una già esistente, esco con successo)
if ( ! pCrv1->TrimEndAtParam( dLocU) || ! pCrv2->TrimStartAtParam( dLocU))
return true ;
// elimino la curva originale
@@ -1955,17 +1955,17 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint)
else if ( IsClosed())
nNextCrv = 0 ;
ICurve* pNextCrv = ( nNextCrv != -1 ? m_CrvSmplS[ nNextCrv] : nullptr) ;
// recupero punto iniziale dell'entità precedente (se esiste)
// recupero punto iniziale dell'entità precedente (se esiste)
Point3d ptStart ;
if ( pPrevCrv != nullptr && ! pPrevCrv->GetStartPoint( ptStart))
return false ;
// recupero punto finale dell'entità successiva (se esiste)
// recupero punto finale dell'entità successiva (se esiste)
Point3d ptEnd ;
if ( pNextCrv != nullptr && ! pNextCrv->GetEndPoint( ptEnd))
return false ;
// modifico il punto finale dell'eventuale entità precedente
// modifico il punto finale dell'eventuale entità precedente
if ( pPrevCrv != nullptr && ! pPrevCrv->ModifyEnd( ptNewJoint)) {
// se entità precedente si annulla, la elimino
// se entità precedente si annulla, la elimino
if ( AreSamePointApprox( ptStart, ptNewJoint)) {
delete pPrevCrv ;
m_CrvSmplS.erase( m_CrvSmplS.begin() + nPrevCrv) ;
@@ -1982,9 +1982,9 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint)
delete( pPrevCrv) ;
}
}
// modifico il punto iniziale dell'eventuale entità successiva
// modifico il punto iniziale dell'eventuale entità successiva
if ( pNextCrv != nullptr && ! pNextCrv->ModifyStart( ptNewJoint)) {
// se entità successiva si annulla, la elimino
// se entità successiva si annulla, la elimino
if ( AreSamePointApprox( ptNewJoint, ptEnd)) {
delete pNextCrv ;
m_CrvSmplS.erase( m_CrvSmplS.begin() + nNextCrv) ;
@@ -2101,17 +2101,17 @@ CurveComposite::MoveCurve( int nCrv, const Vector3d& vtMove)
else if ( IsClosed())
nNextCrv = 0 ;
ICurve* pNextCrv = ( nNextCrv != -1 ? m_CrvSmplS[ nNextCrv] : nullptr) ;
// recupero punti iniziale e finale dell'entità precedente (se esiste)
// recupero punti iniziale e finale dell'entità precedente (se esiste)
Point3d ptPrevStart, ptPrevEnd ;
if ( pPrevCrv != nullptr && ( ! pPrevCrv->GetStartPoint( ptPrevStart) || ! pPrevCrv->GetEndPoint( ptPrevEnd)))
return false ;
// recupero punti iniziale e finale dell'entità successiva (se esiste)
// recupero punti iniziale e finale dell'entità successiva (se esiste)
Point3d ptNextStart, ptNextEnd ;
if ( pNextCrv != nullptr && ( ! pNextCrv->GetStartPoint( ptNextStart) || ! pNextCrv->GetEndPoint( ptNextEnd)))
return false ;
// modifico il punto finale dell'eventuale entità precedente
// modifico il punto finale dell'eventuale entità precedente
if ( pPrevCrv != nullptr && ! pPrevCrv->ModifyEnd( ptPrevEnd + vtMove)) {
// se entità precedente si annulla, la elimino
// se entità precedente si annulla, la elimino
if ( AreSamePointApprox( ptPrevStart, ptPrevEnd + vtMove)) {
delete pPrevCrv ;
m_CrvSmplS.erase( m_CrvSmplS.begin() + nPrevCrv) ;
@@ -2130,9 +2130,9 @@ CurveComposite::MoveCurve( int nCrv, const Vector3d& vtMove)
delete( pPrevCrv) ;
}
}
// modifico il punto iniziale dell'eventuale entità successiva
// modifico il punto iniziale dell'eventuale entità successiva
if ( pNextCrv != nullptr && ! pNextCrv->ModifyStart( ptNextStart + vtMove)) {
// se entità successiva si annulla, la elimino
// se entità successiva si annulla, la elimino
if ( AreSamePointApprox( ptNextStart + vtMove, ptNextEnd)) {
delete pNextCrv ;
m_CrvSmplS.erase( m_CrvSmplS.begin() + nNextCrv) ;
@@ -2209,7 +2209,7 @@ CurveComposite::ModifyCurveToLine( int nCrv)
return false ;
// recupero la curva corrente
ICurve* pCrv = m_CrvSmplS[nCrv] ;
// se già linea non devo fare alcunchè
// se già linea non devo fare alcunchè
if ( pCrv->GetType() == CRV_LINE)
return true ;
// recupero gli estremi
@@ -2237,7 +2237,7 @@ CurveComposite::ModifyCurveToLine( int nCrv)
bool
CurveComposite::TrimStartAtParam( double dUTrim)
{
// verifico validità parametro
// verifico validità parametro
double dMaxU = double( m_CrvSmplS.size()) ;
if ( dUTrim < -EPS_PARAM || dUTrim > dMaxU - EPS_PARAM)
return false ;
@@ -2267,7 +2267,7 @@ CurveComposite::TrimStartAtParam( double dUTrim)
Iter = m_CrvSmplS.erase( Iter) ;
break ;
}
// altrimenti superata lunghezza ancora da tagliare (taglio già fatto al test sopra)
// altrimenti superata lunghezza ancora da tagliare (taglio già fatto al test sopra)
else {
break ;
}
@@ -2280,7 +2280,7 @@ CurveComposite::TrimStartAtParam( double dUTrim)
bool
CurveComposite::TrimEndAtParam( double dUTrim)
{
// verifico validità parametro
// verifico validità parametro
double dMaxU = double( m_CrvSmplS.size()) ;
if ( dUTrim < EPS_PARAM || dUTrim > dMaxU + EPS_PARAM)
return false ;
@@ -2301,7 +2301,7 @@ CurveComposite::TrimEndAtParam( double dUTrim)
dUToTrim -= ( dParEnd - dParStart) ;
// se da cancellare
if ( bToErase) {
// cancello l'entità, la tolgo dalla lista e passo alla successiva
// cancello l'entità, la tolgo dalla lista e passo alla successiva
delete (*Iter) ;
Iter = m_CrvSmplS.erase( Iter) ;
}
@@ -2311,7 +2311,7 @@ CurveComposite::TrimEndAtParam( double dUTrim)
}
// se lunghezza parametrica ancora da tagliare nulla (entro la tolleranza)
else if ( dUToTrim > - EPS_PARAM) {
// passo alla entità successiva
// passo alla entità successiva
++ Iter ;
// dichiaro ingresso in zona da cancellare
bToErase = true ;
@@ -2324,7 +2324,7 @@ CurveComposite::TrimEndAtParam( double dUTrim)
bToErase = true ;
continue ;
}
// passo alla entità successiva
// passo alla entità successiva
++ Iter ;
// dichiaro ingresso in zona da cancellare
bToErase = true ;
@@ -2389,7 +2389,7 @@ CurveComposite::TrimStartEndAtParam( double dUStartTrim, double dUEndTrim)
bool
CurveComposite::TrimStartAtLen( double dLenTrim)
{
// verifico validità lunghezza risultante
// verifico validità lunghezza risultante
if ( dLenTrim < EPS_ZERO)
return true ;
double dLen ;
@@ -2443,7 +2443,7 @@ CurveComposite::TrimStartAtLen( double dLenTrim)
bool
CurveComposite::TrimEndAtLen( double dLenTrim)
{
// verifico validità lunghezza risultante
// verifico validità lunghezza risultante
if ( dLenTrim < EPS_SMALL)
return false ;
double dLen ;
@@ -2456,7 +2456,7 @@ CurveComposite::TrimEndAtLen( double dLenTrim)
double dLenToTrim = dLenTrim ;
for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ;) {
double dCrvLen = 0 ;
// se non sono già nella zona da cancellare, aggiorno lunghezze
// se non sono già nella zona da cancellare, aggiorno lunghezze
if ( ! bToErase) {
// lunghezza della curva
if ( ! (*Iter)->GetLength( dCrvLen))
@@ -2466,18 +2466,18 @@ CurveComposite::TrimEndAtLen( double dLenTrim)
}
// se da cancellare
if ( bToErase) {
// cancello l'entità, la tolgo dalla lista e passo alla successiva
// cancello l'entità, la tolgo dalla lista e passo alla successiva
delete (*Iter) ;
Iter = m_CrvSmplS.erase( Iter) ;
}
// se lunghezza ancora da tagliare non nulla
else if ( dLenToTrim > EPS_SMALL) {
// passo alla entità successiva
// passo alla entità successiva
++ Iter ;
}
// se lunghezza ancora da tagliare nulla (entro la tolleranza)
else if ( dLenToTrim > - EPS_SMALL) {
// passo alla entità successiva
// passo alla entità successiva
++ Iter ;
// dichiaro ingresso in zona da cancellare
bToErase = true ;
@@ -2489,7 +2489,7 @@ CurveComposite::TrimEndAtLen( double dLenTrim)
m_nStatus = ERR ;
return false ;
}
// passo alla entità successiva
// passo alla entità successiva
++ Iter ;
// dichiaro ingresso in zona da cancellare
bToErase = true ;
@@ -2565,8 +2565,10 @@ CurveComposite::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2584,12 +2586,14 @@ CurveComposite::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAn
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2649,9 +2653,9 @@ CurveComposite::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, dou
// se tutto bene, passo alla prossima
if ( bOk)
++Iter ;
// altrimenti, l'entità si è annullata => devo toglierla dalla lista e cancellarla
// altrimenti, l'entità si è annullata => devo toglierla dalla lista e cancellarla
else {
// si è annullata l'entità, la elimino e la tolgo dalla lista
// si è annullata l'entità, la elimino e la tolgo dalla lista
delete (*Iter) ;
Iter = m_CrvSmplS.erase( Iter) ;
}
@@ -2699,7 +2703,7 @@ CurveComposite::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -2725,7 +2729,7 @@ CurveComposite::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
@@ -2760,16 +2764,18 @@ CurveComposite::ToGlob( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2790,16 +2796,18 @@ CurveComposite::ToLoc( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2820,16 +2828,18 @@ CurveComposite::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
return true ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2976,7 +2986,7 @@ CurveComposite::RemoveFirstOrLastCurve( bool bLast)
bool
CurveComposite::IsParamAtJoint( double dU) const
{
// se aperta e all'inizio o alla fine o lontano dagli interi non è giunzione
// se aperta e all'inizio o alla fine o lontano dagli interi non è giunzione
bool bClosed = IsClosed() ;
if ( ( ! bClosed && abs( dU) < EPS_PARAM) ||
( ! bClosed && abs( dU - double( m_CrvSmplS.size())) < EPS_PARAM) ||
@@ -2994,7 +3004,7 @@ CurveComposite::ChangeStartPoint( double dU)
if ( ! IsClosed())
return false ;
// questa funzione gestisce già anche il cambio di inizio su curve chiuse
// questa funzione gestisce già anche il cambio di inizio su curve chiuse
return TrimStartEndAtParam( dU, dU) ;
}
@@ -3004,19 +3014,19 @@ CurveComposite::ArcsToBezierCurves( void)
{
// verifico le singole curve
for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ; ++Iter) {
// se arco, devo trasformare in una o più curve di Bezier
// se arco, devo trasformare in una o più curve di Bezier
if ( (*Iter)->GetType() == CRV_ARC) {
// eseguo trasformazione
PtrOwner<ICurve> pNewCrv( ArcToBezierCurve( (*Iter))) ;
if ( IsNull( pNewCrv))
return false ;
// se risultato è singola curva
// se risultato è singola curva
if ( pNewCrv->IsSimple()) {
// elimino l'arco e lo sostituisco con la curva di Bezier
delete (*Iter) ;
(*Iter) = Release( pNewCrv) ;
}
// altrimenti è una curva composita
// altrimenti è una curva composita
else {
CurveComposite* pCC = GetBasicCurveComposite( pNewCrv) ;
if ( pCC == nullptr)
@@ -3058,13 +3068,13 @@ CurveComposite::ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDe
(*Iter)->SetExtrusion( V_NULL) ;
if ( IsNull( pNewCrv))
return false ;
// se risultato è singola curva
// se risultato è singola curva
if ( pNewCrv->IsSimple()) {
// elimino la curva originale e la sostituisco con l'arco
delete (*Iter) ;
(*Iter) = Release( pNewCrv) ;
}
// altrimenti è una curva composita
// altrimenti è una curva composita
else {
CurveComposite* pCC = GetBasicCurveComposite( pNewCrv) ;
if ( pCC == nullptr)
@@ -3130,7 +3140,7 @@ CurveComposite::StraightArcsToLines( double dLinTol, double dAngTolDeg)
static int
MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAngTol, bool bNeedSameProp)
{
// verifico compatibilità delle proprietà
// verifico compatibilità delle proprietà
int nTpr0P = pCrvP->GetTempProp( 0) ;
int nTpr0C = pCrvC->GetTempProp( 0) ;
int nTpr1P = pCrvP->GetTempProp( 1) ;
@@ -3177,7 +3187,7 @@ MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAn
if ( pLineC->ModifyStart( pLineP->GetStart())) {
// diminuisco la tolleranza corrente dell'errore attuale
dCurrLinTol -= COEFF_TOL * sqrt( dSqDist) ;
// se curve originali con proprietà diversa, la cancello
// se curve originali con proprietà diversa, la cancello
if ( nTpr0P != nTpr0C)
pLineC->SetTempProp( 0, 0) ;
if ( nTpr1P != nTpr1C)
@@ -3202,7 +3212,7 @@ MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAn
// verifico la coincidenza dei raggi
if ( abs( pArcP->GetRadius() - pArcC->GetRadius()) > dCurrLinTol)
return 0 ;
// verifico la collinearità delle normali (tenendo conto del raggio)
// verifico la collinearità delle normali (tenendo conto del raggio)
if ( ! (( pArcP->GetNormVersor() - pArcC->GetNormVersor()) * pArcP->GetRadius()).IsSmall() &&
! (( pArcP->GetNormVersor() + pArcC->GetNormVersor()) * pArcP->GetRadius()).IsSmall())
return 0 ;
@@ -3230,7 +3240,7 @@ MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAn
// verifico normale al piano dell'arco
if ( NewArc.GetNormVersor() * pArcC->GetNormVersor() < 0)
NewArc.InvertN() ;
// se curve originali con la stessa proprietà, la riporto
// se curve originali con la stessa proprietà, la riporto
if ( nTpr0P == nTpr0C)
NewArc.SetTempProp( nTpr0C, 0) ;
if ( nTpr1P == nTpr1C)
@@ -3255,7 +3265,7 @@ MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAn
pArcC->GetEndPoint( ptP3) ;
CurveArc NewArc ;
if ( NewArc.Set2PVN( ptP1, ptP3, vtDir1, pArcC->GetNormVersor())) {
// se curve originali con la stessa proprietà, la riporto
// se curve originali con la stessa proprietà, la riporto
if ( nTpr0P == nTpr0C)
NewArc.SetTempProp( nTpr0C, 0) ;
if ( nTpr1P == nTpr1C)
@@ -3293,11 +3303,11 @@ CurveComposite::MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd,
while ( iterC != m_CrvSmplS.end()) {
// se curve unite
switch ( MergeTwoCurves( *iterP, *iterC, dCurrLinTol, dCosAngTol, bNeedSameProp)) {
case -1 : // cancello l'entità precedente e la tolgo dalla lista
case -1 : // cancello l'entità precedente e la tolgo dalla lista
delete (*iterP) ;
iterC = m_CrvSmplS.erase( iterP) ;
break ;
case 1 : // cancello l'entità corrente e la tolgo dalla lista
case 1 : // cancello l'entità corrente e la tolgo dalla lista
delete (*iterC) ;
iterC = m_CrvSmplS.erase( iterC) ;
iterC = prev( iterC) ;
@@ -3314,11 +3324,11 @@ CurveComposite::MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd,
if ( bStartEnd && m_CrvSmplS.size() >= 2 && IsClosed()) {
iterC = m_CrvSmplS.begin() ;
switch ( MergeTwoCurves( *iterP, *iterC, dCurrLinTol, dCosAngTol, bNeedSameProp)) {
case -1 : // cancello l'entità precedente e la tolgo dalla lista
case -1 : // cancello l'entità precedente e la tolgo dalla lista
delete (*iterP) ;
m_CrvSmplS.erase( iterP) ;
break ;
case 1 : // cancello l'entità corrente e la tolgo dalla lista
case 1 : // cancello l'entità corrente e la tolgo dalla lista
delete (*iterC) ;
m_CrvSmplS.erase( iterC) ;
break ;
@@ -3377,7 +3387,7 @@ SplitTopBottomArcs( CurveComposite& cCompo)
// le ordino in senso crescente di ampiezza assoluta
if ( abs( dAng1) > abs( dAng2))
swap( dAng1, dAng2) ;
// verifico se la prima di queste rotazioni è compresa nell'arco
// verifico se la prima di queste rotazioni è compresa nell'arco
if ( abs( dAng1) > EPS_ANG_SMALL && abs( dAng1) < abs( pArc->GetAngCenter()) - EPS_ANG_SMALL) {
cCompo.AddJoint( i + dAng1 / pArc->GetAngCenter()) ;
}
@@ -3427,7 +3437,7 @@ CurveComposite::RemoveUndercutOnY( double dLinTol, double dAngTolDeg)
Point3d ptStart, ptEnd ;
pCompo->GetStartPoint( ptStart) ;
pCompo->GetEndPoint( ptEnd) ;
// se curva pressochè verticale non sottende alcunché, quindi la salto
// se curva pressochè verticale non sottende alcunché, quindi la salto
if ( abs( ptStart.x - ptEnd.x) < EPS_SMALL)
continue ;
// ordino gli estremi
@@ -3533,7 +3543,7 @@ CurveComposite::IsALine( double dLinTol, Point3d& ptStart, Point3d& ptEnd) const
// elimino i punti allineati entro la tolleranza
if ( ! PL.RemoveAlignedPoints( dLinTol))
return false ;
// se sono rimasti due punti è una retta
// se sono rimasti due punti è una retta
return ( PL.GetPointNbr() == 2) ;
}
@@ -3541,7 +3551,7 @@ CurveComposite::IsALine( double dLinTol, Point3d& ptStart, Point3d& ptEnd) const
bool
CurveComposite::IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const
{
// deve essere una sola entità
// deve essere una sola entità
if ( GetCurveCount() != 1)
return false ;
// deve essere un arco di circonferenza completo
@@ -3564,7 +3574,7 @@ CurveComposite::IsACircle( double dLinTol, Point3d& ptCen, Vector3d& vtN, double
if ( ! IsClosed())
return false ;
// se è formata da una sola entità arco che è una circonferenza
// se è formata da una sola entità arco che è una circonferenza
if ( IsOneCircle( ptCen, vtN, dRad, bCCW))
return true ;
@@ -3601,10 +3611,10 @@ CurveComposite::IsARectangle( double dLinTol, Point3d& ptP, Vector3d& vtL1, Vect
Point3d ptV2 ; PL.GetNextPoint( ptV2) ;
Point3d ptV3 ; PL.GetNextPoint( ptV3) ;
Point3d ptV4 ; PL.GetNextPoint( ptV4) ;
// verifico che le diagonali si incontrino nel loro punto medio (-> è un parallelogramma)
// verifico che le diagonali si incontrino nel loro punto medio (-> è un parallelogramma)
if ( ! AreSamePointEpsilon( Media( ptV1, ptV3), Media( ptV2, ptV4), dLinTol / 2))
return false ;
// verifico che le diagonali abbiano la stessa lunghezza (-> è un rettangolo)
// verifico che le diagonali abbiano la stessa lunghezza (-> è un rettangolo)
if ( abs( Dist( ptV1, ptV3) - Dist( ptV2, ptV4)) > dLinTol)
return false ;
// assegno i parametri del rettangolo
@@ -3637,7 +3647,7 @@ CurveComposite::IsATrapezoid( double dLinTol, Point3d& ptP, Vector3d& vtB1, Vect
Point3d ptV2 ; PL.GetNextPoint( ptV2) ;
Point3d ptV3 ; PL.GetNextPoint( ptV3) ;
Point3d ptV4 ; PL.GetNextPoint( ptV4) ;
// verifico se V4->V3 è parallelo a V1->V2
// verifico se V4->V3 è parallelo a V1->V2
double dV3B12, dV4B12 ;
if ( ! DistPointLine( ptV3, ptV1, ptV2, false).GetDist( dV3B12) ||
! DistPointLine( ptV4, ptV1, ptV2, false).GetDist( dV4B12))
@@ -3649,7 +3659,7 @@ CurveComposite::IsATrapezoid( double dLinTol, Point3d& ptP, Vector3d& vtB1, Vect
vtB2 = ptV3 - ptV4 ;
return true ;
}
// verifico se V1->V4 è parallelo a V2->V3
// verifico se V1->V4 è parallelo a V2->V3
double dV1B23, dV4B23 ;
if ( ! DistPointLine( ptV1, ptV2, ptV3, false).GetDist( dV1B23) ||
! DistPointLine( ptV4, ptV2, ptV3, false).GetDist( dV4B23))
@@ -3661,7 +3671,7 @@ CurveComposite::IsATrapezoid( double dLinTol, Point3d& ptP, Vector3d& vtB1, Vect
vtB2 = ptV4 - ptV1 ;
return true ;
}
// non è un trapezio
// non è un trapezio
return false ;
}
@@ -3747,7 +3757,7 @@ CurveComposite::GetVoronoiObject() const
if ( m_nStatus != OK)
return nullptr ;
// se non è stato calcolato, lo calcolo
// se non è stato calcolato, lo calcolo
if ( m_pVoronoiObj == nullptr)
CalcVoronoiObject() ;
+2 -2
View File
@@ -198,6 +198,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool RelocateFrom( CurveComposite& ccSrc) ;
bool GetApproxLength( double& dLen) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveComposite& ccSrc) ;
@@ -209,7 +210,6 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool SimpleOffsetXY( double dDist, int nType = OFF_FILLET) ;
bool IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -225,7 +225,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
Point3d m_ptStart ; // punto iniziale per composita vuota per Add di linee o archi
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
mutable PCSD_CONST_ITER m_Iter ; // iteratore
+37 -27
View File
@@ -162,7 +162,7 @@ CurveLine::Dump( string& sOut, bool bMM, const char* szNewLine) const
// dati generali di una curva
if ( ! CurveDump( *this, sOut, bMM, szNewLine))
return false ;
// parametri : sono già compresi nei dati generali (PS e PE)
// parametri : sono già compresi nei dati generali (PS e PE)
return true ;
}
@@ -223,7 +223,7 @@ CurveLine::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
return false ;
// assegno il box in locale
b3Loc.Set( m_PtStart, m_PtEnd) ;
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Point3d ptMinExtr = b3Loc.GetMin() + m_VtExtr * m_dThick ;
Point3d ptMaxExtr = b3Loc.GetMax() + m_VtExtr * m_dThick ;
@@ -241,7 +241,7 @@ CurveLine::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// porto gli estremi nel riferimento passato
@@ -251,7 +251,7 @@ CurveLine::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
ptFrEnd.ToGlob( frRef) ;
// assegno il box nel riferimento
b3Ref.Set( ptFrStart, ptFrEnd) ;
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Vector3d vtFrExtr = m_VtExtr ;
vtFrExtr.ToGlob( frRef) ;
@@ -390,7 +390,7 @@ CurveLine::GetLength( double& dLen) const
if ( m_nStatus != OK)
return false ;
// la lunghezza è la distanza tra gli estremi
// la lunghezza è la distanza tra gli estremi
dLen = Dist( m_PtStart, m_PtEnd) ;
return ( dLen > EPS_SMALL) ;
@@ -416,7 +416,7 @@ CurveLine::GetLengthAtParam( double dU, double& dLen) const
return true ;
}
// la lunghezza totale è la distanza tra gli estremi
// la lunghezza totale è la distanza tra gli estremi
double dTotLen = Dist( m_PtStart, m_PtEnd) ;
// fine
@@ -448,7 +448,7 @@ CurveLine::GetParamAtLength( double dLen, double& dU) const
return true ;
}
// la lunghezza totale è la distanza tra gli estremi
// la lunghezza totale è la distanza tra gli estremi
double dTotLen = Dist( m_PtStart, m_PtEnd) ;
// se dopo fine, errore
@@ -811,8 +811,10 @@ CurveLine::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -830,12 +832,14 @@ CurveLine::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, do
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -894,7 +898,7 @@ CurveLine::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -919,7 +923,7 @@ CurveLine::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& v
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
@@ -949,16 +953,18 @@ CurveLine::ToGlob( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -973,16 +979,18 @@ CurveLine::ToLoc( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -997,16 +1005,18 @@ CurveLine::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1065,7 +1075,7 @@ CurveLine::GetVoronoiObject() const
if ( m_nStatus != OK)
return nullptr ;
// se non è stato calcolato, lo calcolo
// se non è stato calcolato, lo calcolo
if ( m_pVoronoiObj == nullptr)
CalcVoronoiObject() ;
+3 -3
View File
@@ -161,12 +161,12 @@ class CurveLine : public ICurveLine, public IGeoObjRW
LOG_ERROR( GetEGkLogger(), "CurveLine : copy error")
return *this ; }
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveLine& clSrc) ;
bool Validate( void) ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
bool CalcVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -178,7 +178,7 @@ class CurveLine : public ICurveLine, public IGeoObjRW
Point3d m_PtEnd ; // punto finale
Vector3d m_VtExtr ; // vettore estrusione
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+47 -39
View File
@@ -75,7 +75,7 @@ SurfFlatRegion::Clear( void)
bool
SurfFlatRegion::AddExtLoop( const ICurve& cCrv)
{
// verifico validità curva
// verifico validità curva
if ( &cCrv == nullptr)
return false ;
// creo una copia della curva
@@ -221,7 +221,7 @@ SurfFlatRegion::MyAddExtLoop( ICurve* pCrv)
bool
SurfFlatRegion::AddIntLoop( const ICurve& cCrv)
{
// verifico validità curva
// verifico validità curva
if ( &cCrv == nullptr)
return false ;
// creo una copia della curva
@@ -435,7 +435,7 @@ SurfFlatRegion::GetTitle( void) const
bool
SurfFlatRegion::Dump( string& sOut, bool bMM, const char* szNewLine) const
{
// verifico validità regione
// verifico validità regione
if ( m_nStatus != OK)
sOut += string( "Status=Invalid") + szNewLine ;
// area
@@ -583,7 +583,7 @@ SurfFlatRegion::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
return false ;
// reset del bbox
b3Loc.Reset() ;
// è il bounding box dei loop esterni
// è il bounding box dei loop esterni
for ( auto i : m_vExtInd) {
BBox3d b3Tmp ;
if ( m_vpLoop[i]->GetBBox( m_frF, b3Tmp, nFlag))
@@ -603,7 +603,7 @@ SurfFlatRegion::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
Frame3d frCompo = m_frF * frRef ;
// reset del bbox
b3Ref.Reset() ;
// è il bounding box dei loop esterni
// è il bounding box dei loop esterni
for ( auto i : m_vExtInd) {
BBox3d b3Tmp ;
if ( m_vpLoop[i]->GetBBox( frCompo, b3Tmp, nFlag))
@@ -622,8 +622,9 @@ SurfFlatRegion::Translate( const Vector3d& vtMove)
// imposto ricalcolo della grafica
ResetAuxSurf() ;
m_OGrMgr.Reset() ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// traslo il riferimento
m_frF.Translate( vtMove) ;
return true ;
@@ -636,15 +637,16 @@ SurfFlatRegion::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAn
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo della grafica
ResetAuxSurf() ;
m_OGrMgr.Reset() ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// ruoto il riferimento
return m_frF.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
@@ -673,7 +675,7 @@ SurfFlatRegion::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, dou
return false ;
}
// parziale scalatura del riferimento (non può essere completa)
// parziale scalatura del riferimento (non può essere completa)
Frame3d frTrasf = m_frF ;
m_frF.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
@@ -712,7 +714,7 @@ SurfFlatRegion::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// verifico lo stato
if ( m_nStatus != OK || m_vpLoop.empty())
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -722,7 +724,7 @@ SurfFlatRegion::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// parziale mirror del riferimento (non può essere completa)
// parziale mirror del riferimento (non può essere completa)
Frame3d frTrasf = m_frF ;
m_frF.PseudoMirror( ptOn, vtNorm) ;
@@ -762,7 +764,7 @@ SurfFlatRegion::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector
// verifico lo stato
if ( m_nStatus != OK || m_vpLoop.empty())
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
@@ -778,7 +780,7 @@ SurfFlatRegion::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector
return false ;
}
// parziale scorrimento del riferimento (non può essere completa)
// parziale scorrimento del riferimento (non può essere completa)
Frame3d frTrasf = m_frF ;
m_frF.PseudoShear( ptOn, vtNorm, vtDir, dCoeff) ;
@@ -832,19 +834,21 @@ SurfFlatRegion::ToGlob( const Frame3d& frRef)
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo della grafica
ResetAuxSurf() ;
m_OGrMgr.Reset() ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// trasformo il riferimento
return m_frF.ToGlob( frRef) ; ;
@@ -857,19 +861,21 @@ SurfFlatRegion::ToLoc( const Frame3d& frRef)
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo della grafica
ResetAuxSurf() ;
m_OGrMgr.Reset() ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// trasformo il riferimento
return m_frF.ToLoc( frRef) ; ;
@@ -882,19 +888,21 @@ SurfFlatRegion::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo della grafica
ResetAuxSurf() ;
m_OGrMgr.Reset() ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// trasformo il riferimento
return m_frF.LocToLoc( frOri, frDest) ; ;
@@ -978,7 +986,7 @@ SurfFlatRegion::GetCentroid( Point3d& ptCen) const
return false ;
// medio il centro
ptCen /= dArea ;
// lo porto dal riferimento intrinseco a quello in cui è immersa l'entità
// lo porto dal riferimento intrinseco a quello in cui è immersa l'entità
ptCen.ToGlob( m_frF) ;
return true ;
}
@@ -997,7 +1005,7 @@ SurfFlatRegion::GetChunkCentroid( int nChunk, Point3d& ptCen) const
const ICurve* pCrv = GetMyLoop( nChunk, 0) ;
if ( pCrv == nullptr || ! pCrv->GetCentroid( ptCen))
return false ;
// lo porto dal riferimento intrinseco a quello in cui è immersa l'entità
// lo porto dal riferimento intrinseco a quello in cui è immersa l'entità
ptCen.ToGlob( m_frF) ;
return true ;
}
@@ -1023,7 +1031,7 @@ SurfFlatRegion::GetLoopCount( int nChunk) const
int nChunkMax = int( m_vExtInd.size()) - 1 ;
if ( nChunk < 0 || nChunk > nChunkMax)
return 0 ;
// se non è l'ultimo Chunk
// se non è l'ultimo Chunk
if ( nChunk < nChunkMax)
return ( m_vExtInd[nChunk+1] - m_vExtInd[nChunk]) ;
// altrimenti
@@ -1053,7 +1061,7 @@ SurfFlatRegion::GetChunkLoopFromInd( int nInd, int& nChunk, int& nLoop) const
// valori non validi
nChunk = - 1 ;
nLoop = - 1 ;
// verifico validità di nInd
// verifico validità di nInd
if ( nInd < 0 || nInd >= int( m_vpLoop.size()))
return false ;
// verifica esistenza array di chunks
@@ -1105,7 +1113,7 @@ SurfFlatRegion::GetLoop( int nChunk, int nLoop) const
return nullptr ;
// assegno la normale alla regione come estrusione
pCrv->SetExtrusion( Z_AX) ;
// la porto nel riferimento in cui è inserito l'oggetto
// la porto nel riferimento in cui è inserito l'oggetto
pCrv->ToGlob( m_frF) ;
return pCrv ;
}
@@ -1121,7 +1129,7 @@ SurfFlatRegion::ApproxLoopWithLines( int nChunk, int nLoop, double dLinTol, doub
// ne creo una approssimazione
if ( ! pMyCrv->ApproxWithLines( dLinTol, dAngTolDeg, nType, PL))
return false ;
// la porto nel riferimento in cui è inserito l'oggetto
// la porto nel riferimento in cui è inserito l'oggetto
PL.ToGlob( m_frF) ;
return true ;
}
@@ -1174,7 +1182,7 @@ SurfFlatRegion::GetAuxSurf( void) const
// la superficie deve essere validata
if ( m_nStatus != OK || m_vpLoop.empty())
return nullptr ;
// se già calcolata, la restituisco
// se già calcolata, la restituisco
if ( m_pSTM != nullptr)
return m_pSTM ;
// la creo e la salvo
@@ -1222,7 +1230,7 @@ SurfFlatRegion::CloneChunk( int nChunk) const
bool
SurfFlatRegion::MyGetCurveClassification( const ICurve& Crv, double dLenMin, CRVCVECTOR& ccClass) const
{
// la curva deve già essere nel riferimento intrinseco della regione
// la curva deve già essere nel riferimento intrinseco della regione
// verifico lo stato
if ( m_nStatus != OK || m_vpLoop.empty())
return false ;
@@ -1254,7 +1262,7 @@ SurfFlatRegion::MyGetCurveClassification( const ICurve& Crv, double dLenMin, CRV
for ( auto& ccOne : ccPart) {
switch ( ccOne.nClass) {
case CRVC_IN :
// IN è Remove degli altri
// IN è Remove degli altri
break ;
case CRVC_OUT :
// intervallo standard
@@ -1383,7 +1391,7 @@ SurfFlatRegion::GetChunkSimpleClassification( int nChunk, const ISurfFlatRegion&
if ( ! AreSameVectorApprox( m_frF.VersZ(), Reg2.m_frF.VersZ()))
return REGC_NULL ;
// curva esterna del chunk della prima regione (ovviamente già in locale al riferimento intrinseco)
// curva esterna del chunk della prima regione (ovviamente già in locale al riferimento intrinseco)
const ICurve* pCrv1Loc = GetMyLoop( nChunk, 0) ;
// curva esterna del chunk della seconda regione in locale nel riferimento intrinseco della prima
@@ -1453,7 +1461,7 @@ SurfFlatRegion::ResetVoronoiObject() const
bool
SurfFlatRegion::CalcVoronoiDiagram( ICURVEPOVECTOR& vCrvs, int nBound) const
{
// verifico se è stato calcolato
// verifico se è stato calcolato
if ( m_pVoronoiObj == nullptr)
if ( ! CalcVoronoiObject())
return false ;
@@ -1465,7 +1473,7 @@ SurfFlatRegion::CalcVoronoiDiagram( ICURVEPOVECTOR& vCrvs, int nBound) const
bool
SurfFlatRegion::CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) const
{
// verifico se è stato calcolato
// verifico se è stato calcolato
if ( m_pVoronoiObj == nullptr)
if ( ! CalcVoronoiObject())
return false ;
+5 -5
View File
@@ -96,7 +96,7 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
{ return m_frF.VersZ() ; }
int GetChunkCount( void) const override ;
int GetLoopCount( int nChunk) const override ;
ICurve* GetLoop( int nChunk, int nLoop) const override ; // nChunk 0-based, nLoop 0-based (1°esterno, successivi interni)
ICurve* GetLoop( int nChunk, int nLoop) const override ; // nChunk 0-based, nLoop 0-based (1°esterno, successivi interni)
bool ApproxLoopWithLines( int nChunk, int nLoop, double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const override ;
const SurfTriMesh* GetAuxSurf( void) const override ;
SurfFlatRegion* CloneChunk( int nChunk) const override ;
@@ -104,7 +104,8 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
bool GetCurveClassification( const ICurve& Crv, double dLenMin, CRVCVECTOR& ccClass) const override ;
int GetChunkSimpleClassification( int nChunk, const ISurfFlatRegion& Other, int nOthChunk) const override ; // compare only outsides
bool CalcVoronoiDiagram( ICURVEPOVECTOR& vCrvs, int nBound = 3) const override ;
bool CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) const override ;
bool CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) const override ;
void ResetVoronoiObject( void) const override ;
public : // IGeoObjRW
int GetNgeId( void) const override ;
@@ -142,7 +143,7 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
int GetIndFromChunkLoop( int nChunk, int nLoop) const ;
bool GetChunkLoopFromInd( int nInd, int& nChunk, int& nLoop) const ;
ICurve* GetMyLoop( int nInd) const ; // indice nel vettore di tutti i loop
ICurve* GetMyLoop( int nChunk, int nLoop) const ; // nChunk 0-based, nLoop 0-based (1°esterno, successivi interni)
ICurve* GetMyLoop( int nChunk, int nLoop) const ; // nChunk 0-based, nLoop 0-based (1°esterno, successivi interni)
void ResetAuxSurf( void) const ;
bool ConvertArcsToBezierCurves( void) ;
bool MyGetCurveClassification( const ICurve& Crv, double dLenMin, CRVCVECTOR& ccClass) const ;
@@ -152,7 +153,6 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
static SurfFlatRegion* MyNewSurfFromLoops( PCRV_DEQUE& vpLoop) ;
static bool MyTestAndDelete( PCRV_DEQUE& vpCrv) ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
@@ -161,7 +161,7 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
Frame3d m_frF ; // riferimento intrinseco
PCRV_DEQUE m_vpLoop ; // deque delle curve che formano i loop
INTVECTOR m_vExtInd ; // indice dei loop esterni nel precedente vettore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
+49
View File
@@ -974,3 +974,52 @@ Voronoi::AdjustOffsetStart( ICurveComposite& pCrv)
}
return true ;
}
//---------------------------------------------------------------------------
bool
Voronoi::Translate( const Vector3d & vtMove)
{
if ( ! IsValid())
return false ;
return m_Frame.Translate( vtMove) ;
}
//---------------------------------------------------------------------------
bool Voronoi::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
{
if ( ! IsValid())
return false ;
return m_Frame.Rotate( ptAx, vtAx, dAngDeg) ;
}
//---------------------------------------------------------------------------
bool Voronoi::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
{
if ( ! IsValid())
return false ;
return m_Frame.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
}
//---------------------------------------------------------------------------
bool Voronoi::ToGlob( const Frame3d& frRef)
{
if ( ! IsValid())
return false ;
return m_Frame.ToGlob( frRef) ;
}
//---------------------------------------------------------------------------
bool Voronoi::ToLoc( const Frame3d& frRef)
{
if ( ! IsValid())
return false ;
return m_Frame.ToLoc( frRef) ;
}
//---------------------------------------------------------------------------
bool Voronoi::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
{
if ( ! IsValid())
return false ;
return m_Frame.LocToLoc( frOri, frDest) ;
}
+9 -2
View File
@@ -55,6 +55,13 @@ class Voronoi
bool CalcFatCurve( ICURVEPOVECTOR& vOffs, double dOffs, bool bSquareEnds, bool bSquareMids) ;
bool CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) ;
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
@@ -76,10 +83,10 @@ class Voronoi
private :
vroniObject* m_vroni ; // oggetto base della libreria vroni
Frame3d m_Frame ; // frame in cui è espresso l'oggetto 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_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
} ;