EgtGeomKernel :
- pulizia codice.
This commit is contained in:
+33
-30
@@ -112,12 +112,14 @@ RotationMinimizeFrame::GetFrames( FRAME3DVECTOR& vRMFrams)
|
||||
if ( ! m_pCrv->GetLength( dLen))
|
||||
return false ;
|
||||
|
||||
// ricavo il numero degli step
|
||||
int nStep = ceil( dLen / m_dStep) ;
|
||||
|
||||
// in prima posizione viene inserito il frame iniziale
|
||||
m_vRMFrames.push_back( m_Frame0) ;
|
||||
|
||||
// ricavo il numero degli step
|
||||
int nStep = ceil( dLen / m_dStep) ;
|
||||
if ( nStep == 0) // se non ho step allora serve sono il frame iniziale
|
||||
return true ;
|
||||
|
||||
// variabili di utilizzo
|
||||
double dLenCurr = 0 ; // lunghezza della curva allo step i-esimo
|
||||
double dLenNext ; // lunghezza della curva allo step (i+1)-esimo
|
||||
@@ -128,51 +130,54 @@ RotationMinimizeFrame::GetFrames( FRAME3DVECTOR& vRMFrams)
|
||||
return false ;
|
||||
Point3d ptNext ; // punto sulla curva allo step (i+1)-esimo
|
||||
|
||||
// definizione dei versori r,s,t
|
||||
// definizione dei versori "r","s","t"
|
||||
Vector3d vt_r = m_Frame0.VersX() ;
|
||||
Vector3d vt_s = m_Frame0.VersY() ;
|
||||
Vector3d vt_t = m_Frame0.VersZ() ;
|
||||
|
||||
// ricavo la lunghezza dello step di campionamento reale
|
||||
double dStep_real = dLen / nStep ;
|
||||
|
||||
// ciclo sugli step in cui la curva è suddivisa
|
||||
for ( int i = 0 ; i < nStep ; ++ i) {
|
||||
// ricavo la lunghezza della curva nello step successivo
|
||||
dLenNext = min( dLen - EPS_SMALL, ( i + 1) * dLen / nStep) ;
|
||||
// parametro successivo sulla curva
|
||||
// ricavo la lunghezza della curva relativo allo step (i+1)-esimo
|
||||
dLenNext = min( dLen - EPS_SMALL, ( i + 1) * dStep_real) ;
|
||||
// parametro (i+1)-esimo sulla curva
|
||||
if ( ! m_pCrv->GetParamAtLength( dLenNext, dUNext))
|
||||
return false ;
|
||||
// punto successivo sulla curva e suo vettore tangente
|
||||
// punto (i+1)-esimo sulla curva e suo vettore tangente
|
||||
Vector3d vt_t_next ;
|
||||
if ( ! m_pCrv->GetPointD1D2( dUNext, ICurve::FROM_MINUS, ptNext, &vt_t_next) ||
|
||||
! vt_t_next.IsValid() /*|| ! vt_t_next.Normalize()*/)
|
||||
! vt_t_next.IsValid())
|
||||
return false ;
|
||||
// controllo per caso degenere
|
||||
if ( AreSamePointEpsilon( ptCurr, ptNext, EPS_ZERO) || // non esiste R1
|
||||
abs(( ptNext - ptCurr) * ( vt_t_next + vt_t)) < EPS_ZERO) // non esiste R2
|
||||
// controllo per casi degeneri
|
||||
if ( AreSamePointEpsilon( ptCurr, ptNext, EPS_ZERO) || // non esiste il piano R1
|
||||
abs(( ptNext - ptCurr) * ( vt_t_next + vt_t)) < EPS_ZERO) // non esiste il piano R2
|
||||
return false ;
|
||||
// ricavo il vettore di riflessione rispetto al piano R1
|
||||
Vector3d v1 = ptNext - ptCurr ;
|
||||
if ( ! v1.IsValid())
|
||||
Vector3d vR1_norm = ptNext - ptCurr ;
|
||||
if ( ! vR1_norm.IsValid())
|
||||
return false ;
|
||||
// parametro di riflessione per R1
|
||||
double c1 = v1 * v1 ;
|
||||
// riflessione rispetto al piano R1
|
||||
Vector3d vt_r_L = vt_r - ( 2 / c1) * ( v1 * vt_r) * v1 ;
|
||||
Vector3d vt_t_L = vt_t - ( 2 / c1) * ( v1 * vt_t) * v1 ;
|
||||
double dPar1 = vR1_norm * vR1_norm ;
|
||||
// riflessione rispetto al piano R1 ( sistema sinistrorso L )
|
||||
Vector3d vt_r_L = vt_r - ( 2 / dPar1) * ( vR1_norm * vt_r) * vR1_norm ;
|
||||
Vector3d vt_t_L = vt_t - ( 2 / dPar1) * ( vR1_norm * vt_t) * vR1_norm ;
|
||||
// ricavo il vettore di riflessione rispetto al piano R1
|
||||
Vector3d v2 = vt_t_next - vt_t_L ;
|
||||
if ( ! v2.IsValid())
|
||||
Vector3d vR2_norm = vt_t_next - vt_t_L ;
|
||||
if ( ! vR2_norm.IsValid())
|
||||
return false ;
|
||||
// parametro di riflessione per R2
|
||||
double c2 = v2 * v2 ;
|
||||
// versore r del nuovo frame
|
||||
Vector3d vt_r_next = vt_r_L - ( 2 / c2) * ( v2 * vt_r_L) * v2 ;
|
||||
// versore t del nuovo frame
|
||||
double dPar2 = vR2_norm * vR2_norm ;
|
||||
// versore r del nuovo frame (i+1)-esimo
|
||||
Vector3d vt_r_next = vt_r_L - ( 2 / dPar2) * ( vR2_norm * vt_r_L) * vR2_norm ;
|
||||
// versore t del nuovo frame (i+1)-esimo
|
||||
Vector3d vt_s_next = vt_t_next ^ vt_r_next ;
|
||||
// creazione del nuovo frame
|
||||
// creazione del nuovo frame (i+1)-esimo
|
||||
Frame3d RMFrame_next ;
|
||||
RMFrame_next.Set( ptNext, vt_r_next, vt_s_next, vt_t_next) ;
|
||||
if ( ! RMFrame_next.IsValid()) {
|
||||
// sistemo...
|
||||
if ( ! RMFrame_next.IsValid()) { // il frame potrebbe non essere nelle tolleranze...
|
||||
// ... sistemo ricavando il versore "s" mediante "t" ed "r" ...
|
||||
RMFrame_next.Set( ptNext, vt_t_next, vt_r_next) ;
|
||||
if ( ! RMFrame_next.IsValid())
|
||||
return false ;
|
||||
@@ -185,10 +190,8 @@ RotationMinimizeFrame::GetFrames( FRAME3DVECTOR& vRMFrams)
|
||||
ptCurr = ptNext ;
|
||||
}
|
||||
|
||||
// restituisco il vettore di Frame
|
||||
vRMFrams.resize( int( m_vRMFrames.size())) ;
|
||||
|
||||
// oriento i frames ottenuti in modo da avere il versore X tangente alla curva
|
||||
vRMFrams.resize( int( m_vRMFrames.size())) ;
|
||||
for ( int i = 0 ; i < int( m_vRMFrames.size()) ; ++ i) {
|
||||
vRMFrams[i].Set( m_vRMFrames[i].Orig(), m_vRMFrames[i].VersY(), m_vRMFrames[i].VersZ()) ;
|
||||
if ( ! vRMFrams[i].IsValid())
|
||||
|
||||
Reference in New Issue
Block a user