for( unsigned int k = 1; k < n; k++ )
{
- // CM Fixed a bug appearing under Windows : changed the stopping condition from <= to <.
- // Otherwise, on the last step, an element out of the range of vector Q is accessed (Q[ i + 1 ])...
+ // CM Fixed a bug appearing under Windows : changed the stopping
+ // condition from <= to <. Otherwise, on the last step, an element out
+ // of the range of vector Q is accessed (Q[ i + 1 ])...
for( unsigned int i = 0; i < n - k; i++ )
Q[ i ] = ( Q[ i ] * _1u ) + ( Q[ i + 1 ] * u );
fr[ 0 ][ 1 ] = -vT[ 1 ];
fr[ 1 ][ 1 ] = vT[ 0 ];
+ }
+ else if( TVector::Dimension == 3 )
+ {
+ this->_UpdateDerivative( );
+ this->m_Derivative->_UpdateDerivative( );
+ TVector vT = this->m_Derivative->Evaluate( u );
+ TScalar nvT = vT.GetNorm( );
+ if( nvT > TScalar( 0 ) )
+ {
+ vT /= nvT;
+ TVector vN = this->m_Derivative->m_Derivative->Evaluate( u );
+ TScalar nvN = vN.GetNorm( );
+ if( nvT > TScalar( 0 ) )
+ {
+ vN /= nvN;
+ TVector vB;
+ vB[ 0 ] = ( vT[ 1 ] * vN[ 2 ] ) - ( vT[ 2 ] * vN[ 1 ] );
+ vB[ 1 ] = ( vT[ 2 ] * vN[ 0 ] ) - ( vT[ 0 ] * vN[ 2 ] );
+ vB[ 2 ] = ( vT[ 0 ] * vN[ 1 ] ) - ( vT[ 1 ] * vN[ 0 ] );
+
+ for( unsigned int d = 0; d < 3; d++ )
+ {
+ fr[ d ][ 0 ] = vT[ d ];
+ fr[ d ][ 1 ] = vN[ d ];
+ fr[ d ][ 2 ] = vB[ d ];
+
+ } // rof
+ }
+ else
+ std::cerr << "ERROR normal" << std::endl;
+ }
+ else
+ std::cerr << "ERROR tangent" << std::endl;
} // fi
-
- /* TODO
- if( TVector::Dimension == 3 )
- {
- this->_UpdateDerivative( );
- this->m_Derivative->_UpdateDerivative( );
-
- TVector vT = this->m_Derivative->Evaluate( u );
- TVector vN = this->m_Derivative->m_Derivative->Evaluate( u );
- TScalar nvT = vT.GetNorm( );
- TScalar nvN = vN.GetNorm( );
-
- if( nvT > TScalar( 0 ) && nvN > TScalar( 0 ) )
- {
- vT /= nvT;
- vN /= nvN;
-
- TVector vB;
- vB[ 0 ] = ( vT[ 1 ] * vN[ 2 ] ) - ( vT[ 2 ] * vN[ 1 ] );
- vB[ 1 ] = ( vT[ 2 ] * vN[ 0 ] ) - ( vT[ 0 ] * vN[ 2 ] );
- vB[ 2 ] = ( vT[ 0 ] * vN[ 1 ] ) - ( vT[ 1 ] * vN[ 0 ] );
-
- TScalar nvB = vB.GetNorm( );
- if( nvB > TScalar( 0 ) )
- {
- vB /= nvB;
-
- // WARNING: Paranoiac test
- vN[ 0 ] = ( vB[ 1 ] * vT[ 2 ] ) - ( vB[ 2 ] * vT[ 1 ] );
- vN[ 1 ] = ( vB[ 2 ] * vT[ 0 ] ) - ( vB[ 0 ] * vT[ 2 ] );
- vN[ 2 ] = ( vB[ 0 ] * vT[ 1 ] ) - ( vB[ 1 ] * vT[ 0 ] );
-
- for( unsigned int d = 0; d < 3; d++ )
- {
- fr[ d ][ 0 ] = vT[ d ];
- fr[ d ][ 1 ] = vN[ d ];
- fr[ d ][ 2 ] = vB[ d ];
-
- } // rof
- }
- else
- {
- // WARNING: Trick to avoid numerical instabilities
- // in straight lines.
- typedef itk::Vector< TScalar, 3 > _TVector3;
- typedef ext::VectorToFrameFunction< _TVector3 > _TFunction;
-
- _TVector3 vT3;
- vT3[ 0 ] = vT[ 0 ];
- vT3[ 1 ] = vT[ 1 ];
- vT3[ 2 ] = vT[ 2 ];
-
- typename _TFunction::Pointer fun = _TFunction::New( );
- typename _TFunction::TFrame ffr = fun->Evaluate( vT3 );
-
- fr[ 0 ][ 0 ] = ffr[ 0 ][ 0 ];
- fr[ 0 ][ 1 ] = ffr[ 0 ][ 1 ];
- fr[ 0 ][ 2 ] = ffr[ 0 ][ 2 ];
-
- fr[ 1 ][ 0 ] = ffr[ 1 ][ 0 ];
- fr[ 1 ][ 1 ] = ffr[ 1 ][ 1 ];
- fr[ 1 ][ 2 ] = ffr[ 1 ][ 2 ];
-
- fr[ 2 ][ 0 ] = ffr[ 2 ][ 0 ];
- fr[ 2 ][ 1 ] = ffr[ 2 ][ 1 ];
- fr[ 2 ][ 2 ] = ffr[ 2 ][ 2 ];
-
- } // fi
-
- } // fi
-
- } // fi
- */
return( fr );
}