]> Creatis software - bbtk.git/blobdiff - packages/vtk/src/bbvtkTransform.cxx
Clean code
[bbtk.git] / packages / vtk / src / bbvtkTransform.cxx
index 7923cb586c8c7733e430ebdf0cc884ea89051e74..fd4b98e45a078337c81273444e90bc1979122bc8 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "bbvtkTransform.h"
 #include "bbvtkPackage.h"
+#include "vtkMath.h"
 namespace bbvtk
 {
   BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,Transform);
@@ -36,7 +37,8 @@ namespace bbvtk
 
        void Transform::bbUserSetDefaultValues()
        {
-               bbSetInputIn(NULL);
+        bbSetInputIn(NULL);
+               bbSetInputInverse(false);
 
                vecScale.push_back(1);  // scale x
                vecScale.push_back(1);  // scale y
@@ -58,8 +60,8 @@ namespace bbvtk
                vecSpacing.push_back(1);  //spacing y
                vecSpacing.push_back(1);  //spacing z
                bbSetInputSpacing(vecSpacing);
-
-               result = NULL;  
+        
+               result = NULL;
        }
 
        // --------------------------------------------------------------       
@@ -67,6 +69,9 @@ namespace bbvtk
        {
                bbUserFinalizeProcessing();
                result = vtkTransform::New();
+               result->Update();
+               resultInverse = vtkTransform::New();
+               resultInverse->Update();
        }
 
        // --------------------------------------------------------------       
@@ -79,6 +84,7 @@ namespace bbvtk
                }
        }
 
+
        // --------------------------------------------------------------       
   void Transform::Process()
   {
@@ -86,29 +92,55 @@ namespace bbvtk
          if (bbGetInputIn()!=NULL)
       {
                  result->Concatenate( bbGetInputIn()->GetMatrix() );
-      }
-
-         if (bbGetInputScale().size()>=3)
-      {
-                 result->Scale(bbGetInputScale()[0], bbGetInputScale()[1], bbGetInputScale()[2]);
-      }
+      } // if In
          if ((bbGetInputTranslate().size()>=3) && (bbGetInputSpacing().size()>=3))
       {
                  double tx = bbGetInputTranslate()[0] * bbGetInputSpacing()[0];
                  double ty = bbGetInputTranslate()[1] * bbGetInputSpacing()[1];
                  double tz = bbGetInputTranslate()[2] * bbGetInputSpacing()[2];
                  result->Translate(tx,ty,tz);
-      }
-
+      }  // if translate spacing  size >=3
+         if (bbGetInputScale().size()>=3)
+      {
+                 result->Scale(bbGetInputScale()[0], bbGetInputScale()[1], bbGetInputScale()[2]);
+      }  // if scale size >=3
          if (bbGetInputRotateWXYZ().size()>=4)
       {
                  result->RotateWXYZ(bbGetInputRotateWXYZ()[0],bbGetInputRotateWXYZ()[1], bbGetInputRotateWXYZ()[2], bbGetInputRotateWXYZ()[3]);
-      }
-
-         result->Update();
+      } // if rotation size >=4
  
-         bbSetOutputOut(result);
+      if (bbGetInputRotateToNormal().size()>=3)
+      {
+          double v1[3],v2[3],v3[3];
+          v1[0]             = 0;
+          v1[1]             = 0;
+          v1[2]             = 1;
+          v2[0]             = bbGetInputRotateToNormal()[0];
+          v2[1]             = bbGetInputRotateToNormal()[1];
+          v2[2]             = bbGetInputRotateToNormal()[2];
+          
+          double mag= sqrt( v2[0]*v2[0] + v2[1]*v2[1]+ v2[2]*v2[2] ) ;
+                 v2[0] = v2[0] / mag;
+                 v2[1] = v2[1] / mag;
+                 v2[2] = v2[2] / mag;
+          vtkMath *vtkmath  = vtkMath::New();
+          double ang        = acos ( vtkmath->Dot(v1,v2)  );
+          ang               = vtkmath->DegreesFromRadians( ang );
+          vtkmath->Cross( v1,v2,v3 );
+          vtkmath->Delete();
+          result->RotateWXYZ( ang  , v3[0], v3[1], v3[2] );
+      } // if rotation size >=4
+
+         if (bbGetInputInverse()==false)
+         {
+               bbSetOutputOut(result);
+         } else {
+               vtkMatrix4x4 *matrix;
+               matrix=vtkMatrix4x4::New();
+               result->GetInverse(matrix);
+               resultInverse->SetMatrix( matrix );
+               bbSetOutputOut(resultInverse);
+         }  // if Inverse
   }
-}
-// EO namespace bbvtk
+  
+}// EO namespace bbvtk