X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fvtk%2Fsrc%2FbbvtkTransform.cxx;h=fd4b98e45a078337c81273444e90bc1979122bc8;hb=edb8e9b8948e7216e06b3ef5228b16f18417ca52;hp=7923cb586c8c7733e430ebdf0cc884ea89051e74;hpb=66923cdc16451738c67193d83bc453772717ed6b;p=bbtk.git diff --git a/packages/vtk/src/bbvtkTransform.cxx b/packages/vtk/src/bbvtkTransform.cxx index 7923cb5..fd4b98e 100644 --- a/packages/vtk/src/bbvtkTransform.cxx +++ b/packages/vtk/src/bbvtkTransform.cxx @@ -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