diff --git a/CurveArc.cpp b/CurveArc.cpp index 34ec910..d0430e2 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -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() ; diff --git a/CurveArc.h b/CurveArc.h index e8ea208..12c267f 100644 --- a/CurveArc.h +++ b/CurveArc.h @@ -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 } ; diff --git a/CurveAux.cpp b/CurveAux.cpp index ee05bb1..dc2e73b 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -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 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 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 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 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 ; + } +} diff --git a/CurveBezier.cpp b/CurveBezier.cpp index 78351a3..39771bc 100644 --- a/CurveBezier.cpp +++ b/CurveBezier.cpp @@ -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() ; diff --git a/CurveBezier.h b/CurveBezier.h index d50106c..331d545 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -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 } ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index a384685..4537dfc 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -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 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 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 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 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() ; diff --git a/CurveComposite.h b/CurveComposite.h index d682158..90098bb 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -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 diff --git a/CurveLine.cpp b/CurveLine.cpp index 92e78a2..ab21983 100644 --- a/CurveLine.cpp +++ b/CurveLine.cpp @@ -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() ; diff --git a/CurveLine.h b/CurveLine.h index b337501..b409d44 100644 --- a/CurveLine.h +++ b/CurveLine.h @@ -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 } ; diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index 7c0095d..6fe4926 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -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 ; diff --git a/SurfFlatRegion.h b/SurfFlatRegion.h index f41bc41..7de20a6 100644 --- a/SurfFlatRegion.h +++ b/SurfFlatRegion.h @@ -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 diff --git a/Voronoi.cpp b/Voronoi.cpp index d512ec8..781cacf 100644 --- a/Voronoi.cpp +++ b/Voronoi.cpp @@ -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) ; +} diff --git a/Voronoi.h b/Voronoi.h index 5b0e57e..22f86c1 100644 --- a/Voronoi.h +++ b/Voronoi.h @@ -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 } ;