X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFile.cxx;h=e21f6e0a81c76b5da44d9acf5c78db0776194fe4;hb=f88cd7e3127179d20920d54df75bff206be94a09;hp=8248a2a6e2bfb433c17bafb2b69906150ff879a5;hpb=78862d87820021177071181631c6218db14b3fd4;p=gdcm.git diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 8248a2a6..e21f6e0a 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2005/07/21 14:01:49 $ - Version: $Revision: 1.255 $ + Date: $Date: 2005/07/24 02:10:48 $ + Version: $Revision: 1.262 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -78,9 +78,11 @@ #include #include //sscanf #include // for atoi +#include // for pow namespace gdcm { + //----------------------------------------------------------------------------- // Constructor / Destructor @@ -1763,7 +1765,8 @@ File::File( std::string const &filename ) RLEInfo = new RLEFramesInfo; JPEGInfo = new JPEGFragmentsInfo; - Load( filename ); // gdcm::Document is first Loaded, then the 'File part' + SetFileName( filename ); + Load( ); // gdcm::Document is first Loaded, then the 'File part' } /** @@ -1786,7 +1789,7 @@ bool File::Load( std::string const &fileName ) #endif // ----------------------------------------------------------------------------------------- -// THERALYS Algorithm to determine the most similar basic orientation +// THERALYS Algorithm to determine the most similar basic orientation // // Transliterated from original Python code. // Kept as close as possible to the original code @@ -1814,13 +1817,12 @@ bool File::Load( std::string const &fileName ) * # 6 : Heart Sagital * # -6 : Heart Sagital invert */ -float File::TypeOrientation( ) +double File::TypeOrientation( ) { - float *iop = new float[6]; + float iop[6]; bool succ = GetImageOrientationPatient( iop ); if ( !succ ) { - delete iop; return 0.; } @@ -1831,7 +1833,7 @@ float File::TypeOrientation( ) ori1.x = iop[3]; ori2.y = iop[4]; ori2.z = iop[5]; // two perpendicular vectors describe one plane - float dicPlane[6][2][3] = + double dicPlane[6][2][3] = { { {1, 0, 0 },{0, 1, 0 } }, // Axial { {1, 0, 0 },{0, 0, -1 } }, // Coronal { {0, 1, 0 },{0, 0, -1 } }, // Sagittal @@ -1848,7 +1850,7 @@ float File::TypeOrientation( ) res.second = 99999; for (int numDicPlane=0; numDicPlane<6; numDicPlane++) { - i = i + 1; + ++i; // refA=plane[0] refA.x = dicPlane[numDicPlane][0][0]; refA.y = dicPlane[numDicPlane][0][1]; @@ -1860,7 +1862,6 @@ float File::TypeOrientation( ) res=VerfCriterion( i, CalculLikelyhood2Vec(refA,refB,ori1,ori2), res ); res=VerfCriterion( -i, CalculLikelyhood2Vec(refB,refA,ori1,ori2), res ); } - delete iop; return res.first; /* // i=0 @@ -1876,10 +1877,11 @@ float File::TypeOrientation( ) } -Res File::VerfCriterion(int typeCriterion, float criterionNew, Res res) +Res +File::VerfCriterion(int typeCriterion, double criterionNew, Res const & in) { - float type = res.first; - float criterion = res.second; + Res res; + double criterion = in.second; if (criterionNew < criterion) { res.first = criterionNew; @@ -1897,63 +1899,59 @@ Res File::VerfCriterion(int typeCriterion, float criterionNew, Res res) return res; } -float File::CalculLikelyhood2Vec(vector3D refA, vector3D refB, - vector3D ori1, vector3D ori2) +inline double square_dist(vector3D const &v1, vector3D const & v2) +{ + double res; + res = (v1.x - v2.x)*(v1.x - v2.x) + + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z); + return res; +} + +//------------------------- Purpose : ----------------------------------- +//- This function determines the orientation similarity of two planes. +// Each plane is described by two vectors. +//------------------------- Parameters : -------------------------------- +//- : - type : vector 3D (double) +//- : - type : vector 3D (double) +// - Description of the first plane +//- : - type : vector 3D (double) +//- : - type : vector 3D (double) +// - Description of the second plane +//------------------------- Return : ------------------------------------ +// double : 0 if the planes are perpendicular. While the difference of +// the orientation between the planes are big more enlarge is +// the criterion. +//------------------------- Other : ------------------------------------- +// The calculus is based with vectors normalice +double +File::CalculLikelyhood2Vec(vector3D const & refA, vector3D const & refB, + vector3D const & ori1, vector3D const & ori2 ) { -// # ------------------------- Purpose : ----------------------------------- -// # - This function determines the orientation similarity of two planes. -// # Each plane is described by two vectors. -// # ------------------------- Parameters : -------------------------------- -// # - : - type : vector 3D (float) -// # - : - type : vector 3D (float) -// # - Description of the first plane -// # - : - type : vector 3D (float) -// # - : - type : vector 3D (float) -// # - Description of the second plane -// # ------------------------- Return : ------------------------------------ -// # float : 0 if the planes are perpendicular. While the difference of -// # the orientation between the planes are big more enlarge is -// # the criterion. -// # ------------------------- Other : ------------------------------------- -// # The calculus is based with vectors normalice vector3D ori3 = ProductVectorial(ori1,ori2); vector3D refC = ProductVectorial(refA,refB); - float res = powf(refC.x-ori3.x, 2.) + - powf(refC.y-ori3.y, 2.) + - powf(refC.z-ori3.z, 2.); + double res = square_dist(refC, ori3); -/* -// ori3=self.ProductVectorial(ori1,ori2) -// refC=self.ProductVectorial(refA,refB) -// res=math.pow(refC[0]-ori3[0],2) + math.pow(refC[1]-ori3[1],2) + math.pow(refC[2]-ori3[2],2) -// return math.sqrt(res) -*/ return sqrt(res); } -vector3D File::ProductVectorial(vector3D vec1, vector3D vec2) +//------------------------- Purpose : ----------------------------------- +//- Calculus of the poduct vectorial between two vectors 3D +//------------------------- Parameters : -------------------------------- +//- : - type : vector 3D (double) +//- : - type : vector 3D (double) +//------------------------- Return : ------------------------------------ +// (vec) : - Vector 3D +//------------------------- Other : ------------------------------------- +vector3D +File::ProductVectorial(vector3D const & vec1, vector3D const & vec2) { - -// # ------------------------- Purpose : ----------------------------------- -// # - Calculus of the poduct vectorial between two vectors 3D -// # ------------------------- Parameters : -------------------------------- -// # - : - type : vector 3D (float) -// # - : - type : vector 3D (float) -// # ------------------------- Return : ------------------------------------ -// # (vec) : - Vector 3D -// # ------------------------- Other : ------------------------------------- - vector3D vec3; - vec3.x = vec1.y*vec3.z - vec1.z*vec2.y; + vec3.x = vec1.y*vec2.z - vec1.z*vec2.y; vec3.y = -( vec1.x*vec2.z - vec1.z*vec2.x); vec3.z = vec1.x*vec2.y - vec1.y*vec2.x; -/* -// vec3=[0,0,0] -// vec3[0]=vec1[1]*vec2[2] - vec1[2]*vec2[1] -// vec3[1]=-( vec1[0]*vec2[2] - vec1[2]*vec2[0]) -// vec3[2]=vec1[0]*vec2[1] - vec1[1]*vec2[0] -*/ + return vec3; }