EgtGeomKernel :
- gestione traslazione, rotazione e cambi di frame per Voronoi - aggiunta funzione per resettare Voronoi degli oggetti.
This commit is contained in:
+49
-30
@@ -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 ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user