1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #ifndef CLITKORIENTATION_CXX
19 #define CLITKORIENTATION_CXX
21 =================================================
22 * @file clitkOrientation.cxx
23 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
24 * @date 01 Nov 2006 18:02:49
29 =================================================*/
31 #include "clitkOrientation.h"
33 //====================================================================
34 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
36 if ((c == 'R') || (c == 'r')) return itk::SpatialOrientation::ITK_COORDINATE_Right;
37 if ((c == 'L') || (c == 'l')) return itk::SpatialOrientation::ITK_COORDINATE_Left;
38 if ((c == 'P') || (c == 'p')) return itk::SpatialOrientation::ITK_COORDINATE_Posterior;
39 if ((c == 'A') || (c == 'a')) return itk::SpatialOrientation::ITK_COORDINATE_Anterior;
40 if ((c == 'I') || (c == 'i')) return itk::SpatialOrientation::ITK_COORDINATE_Inferior;
41 if ((c == 'S') || (c == 's')) return itk::SpatialOrientation::ITK_COORDINATE_Superior;
42 std::cerr <<"I don't know the orientation '" << c
43 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
46 //====================================================================
48 //====================================================================
49 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
50 itk::SpatialOrientation::CoordinateTerms b)
52 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Right) ||
53 (a==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
54 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Right) ||
55 (b==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
59 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Posterior) ||
60 (a==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
61 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Posterior) ||
62 (b==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
66 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
67 (a==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
68 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
69 (b==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
75 //====================================================================
77 //====================================================================
78 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
80 itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
81 itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
82 itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
84 if (CheckOrientation(f1, f2) && CheckOrientation(f2,f3) && CheckOrientation(f1,f3)) {
85 return static_cast<itk::SpatialOrientation::ValidCoordinateOrientationFlags>(
86 (f1 << itk::SpatialOrientation::ITK_COORDINATE_PrimaryMinor)
87 + (f2 << itk::SpatialOrientation::ITK_COORDINATE_SecondaryMinor)
88 + (f3 << itk::SpatialOrientation::ITK_COORDINATE_TertiaryMinor));
90 std::cerr <<"I don't know the orientation '" << a << b << c
91 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
94 //====================================================================
96 //====================================================================
97 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
99 if (orient.size() >= 3) return GetOrientation(orient[0], orient[1], orient[2]);
100 std::cerr <<"I don't know the orientation '" << orient
101 << "'. Valid string are three letters LR/AP/IS (or in lowercase)" << std::endl;
104 //====================================================================
106 //====================================================================
107 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
109 if (i==0) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 24) >> 24);
110 if (i==1) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 16) >> 24);
111 if (i==2) return static_cast<itk::SpatialOrientation::CoordinateTerms>(orient >> 16);
112 std::cerr <<"Invalid index = " << i << " in GetOrientation" << std::endl;
115 //====================================================================
117 //====================================================================
118 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag)
121 for(int i=0; i<3; i++) {
122 int j = GetOrientation(i, flag);
123 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Right) ||
124 (j == itk::SpatialOrientation::ITK_COORDINATE_Left)) return i;
128 for(int i=0; i<3; i++) {
129 int j = GetOrientation(i, flag);
130 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
131 (j == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return i;
135 for(int i=0; i<3; i++) {
136 int j = GetOrientation(i, flag);
137 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Superior) ||
138 (j == itk::SpatialOrientation::ITK_COORDINATE_Inferior)) return i;
141 return 0; // just to avoid warning
143 //====================================================================
145 //====================================================================
146 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
148 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Right) ||
149 (t == itk::SpatialOrientation::ITK_COORDINATE_Left)) return 0;
150 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
151 (t == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return 1;
152 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
153 (t == itk::SpatialOrientation::ITK_COORDINATE_Superior)) return 2;
154 std::cerr <<"Invalid CoordinateTerms = " << t << std::endl;
157 //====================================================================
159 //====================================================================
160 void clitk::FlipPoint(const itk::Point<double, 3> in,
161 const itk::SpatialOrientation::ValidCoordinateOrientationFlags inFlag,
162 const itk::SpatialOrientation::ValidCoordinateOrientationFlags outFlag,
163 const itk::Point<double, 3> & imageSize,
164 itk::Point<double, 3> & out)
166 for(int i=0; i<3; i++) {
168 itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
170 int inDim = GetDim(inT);
172 int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
175 if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
176 else out[outDim] = imageSize[i]-in[i];
180 //====================================================================
182 #endif /* end #define CLITKORIENTATION_CXX */