-#include "bbvtkTransform.h"
-#include "bbvtkPackage.h"
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ # pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ # This software is governed by the CeCILL-B license under French law and
+ # abiding by the rules of distribution of free software. You can use,
+ # modify and/ or redistribute the software under the terms of the CeCILL-B
+ # license as circulated by CEA, CNRS and INRIA at the following URL
+ # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ # or in the file LICENSE.txt.
+ #
+ # As a counterpart to the access to the source code and rights to copy,
+ # modify and redistribute granted by the license, users are provided only
+ # with a limited warranty and the software's author, the holder of the
+ # economic rights, and the successive licensors have only limited
+ # liability.
+ #
+ # The fact that you are presently reading this means that you have had
+ # knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+#include "bbvtkTransform.h"
+#include "bbvtkPackage.h"
+#include "vtkMath.h"
namespace bbvtk
{
-
BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,Transform);
BBTK_BLACK_BOX_IMPLEMENTATION(Transform,bbtk::AtomicBlackBox);
-
// --------------------------------------------------------------
-
+
void Transform::bbUserSetDefaultValues()
{
- bbSetInputIn(NULL);
-
+ bbSetInputIn(NULL);
+ bbSetInputInverse(false);
+
vecScale.push_back(1); // scale x
vecScale.push_back(1); // scale y
vecScale.push_back(1); // scale z
bbSetInputScale(vecScale);
-
+
vecRotateWXYZ.push_back(0); //angle
vecRotateWXYZ.push_back(1); //vx
vecRotateWXYZ.push_back(0); //vy
vecRotateWXYZ.push_back(0); //vz
bbSetInputRotateWXYZ(vecRotateWXYZ);
-
+
vecTranslate.push_back(0); //tx
vecTranslate.push_back(0); //ty
vecTranslate.push_back(0); //tz
bbSetInputTranslate(vecTranslate);
-
+
vecSpacing.push_back(1); //spacing x
vecSpacing.push_back(1); //spacing y
vecSpacing.push_back(1); //spacing z
- bbSetInputTranslate(vecSpacing);
-
- result = NULL;
+ bbSetInputSpacing(vecSpacing);
+
+ result = NULL;
}
// --------------------------------------------------------------
{
bbUserFinalizeProcessing();
result = vtkTransform::New();
+ result->Update();
+ resultInverse = vtkTransform::New();
+ resultInverse->Update();
}
-
-
+
// --------------------------------------------------------------
void Transform::bbUserFinalizeProcessing()
{
result->Delete();
result=NULL;
}
-
}
-
-
+
+
// --------------------------------------------------------------
void Transform::Process()
{
- printf("EED %p Transform::Process() 1\n", this);
bbUserInitializeProcessing();
if (bbGetInputIn()!=NULL)
{
result->Concatenate( bbGetInputIn()->GetMatrix() );
- printf("EED %p Transform::Process() 2\n", this);
- }
-
- if (bbGetInputScale().size()>=3)
- {
- result->Scale(bbGetInputScale()[0], bbGetInputScale()[1], bbGetInputScale()[2]);
- printf("EED %p Transform::Process() 3\n", this);
- }
-
+ } // 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);
- printf("EED %p Transform::Process() 4\n", this);
- }
-
+ } // 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]);
- printf("EED %p Transform::Process() 5\n", this);
- }
-
- result->Update();
- printf("EED %p Transform::Process() 6\n", this);
-
- bbSetOutputOut(result);
+ } // if rotation size >=4
+
+ 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