]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Extensions/Algorithms/BezierCurveFunction.hxx
Iso slicer added
[cpPlugins.git] / lib / cpPlugins / Extensions / Algorithms / BezierCurveFunction.hxx
index dad148255fed7c033b0471423f4b032e18fecf7d..3aedf8f92a547b144593bdfcda1dda49f5a597c6 100644 (file)
@@ -35,8 +35,9 @@ Evaluate( const TScalar& u ) const
 
   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 );
 
@@ -67,81 +68,41 @@ EvaluateFrenetFrame( const TScalar& u ) const
 
     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 );
 }