]> Creatis software - clitk.git/blob - common/clitkOrientation.cxx
removed headers
[clitk.git] / common / clitkOrientation.cxx
1 #ifndef CLITKORIENTATION_CXX
2 #define CLITKORIENTATION_CXX
3 /**
4    =================================================
5    * @file   clitkOrientation.cxx
6    * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
7    * @date   01 Nov 2006 18:02:49
8    * 
9    * @brief  
10    * 
11    * 
12    =================================================*/
13
14 #include "clitkOrientation.h"
15
16 //====================================================================
17 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
18 {
19   if ((c == 'R') || (c == 'r')) return itk::SpatialOrientation::ITK_COORDINATE_Right;
20   if ((c == 'L') || (c == 'l')) return itk::SpatialOrientation::ITK_COORDINATE_Left;
21   if ((c == 'P') || (c == 'p')) return itk::SpatialOrientation::ITK_COORDINATE_Posterior;
22   if ((c == 'A') || (c == 'a')) return itk::SpatialOrientation::ITK_COORDINATE_Anterior;
23   if ((c == 'I') || (c == 'i')) return itk::SpatialOrientation::ITK_COORDINATE_Inferior;
24   if ((c == 'S') || (c == 's')) return itk::SpatialOrientation::ITK_COORDINATE_Superior;
25   std::cerr <<"I don't know the orientation '" << c 
26             << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
27   exit(0);
28 }
29 //====================================================================
30
31 //====================================================================
32 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
33                              itk::SpatialOrientation::CoordinateTerms b) 
34 {
35   if ((a==itk::SpatialOrientation::ITK_COORDINATE_Right) || 
36       (a==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
37     if ((b==itk::SpatialOrientation::ITK_COORDINATE_Right) ||
38         (b==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
39       return false;
40     }
41   }
42   if ((a==itk::SpatialOrientation::ITK_COORDINATE_Posterior) || 
43       (a==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
44     if ((b==itk::SpatialOrientation::ITK_COORDINATE_Posterior) ||
45         (b==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
46       return false;
47     }
48   }
49   if ((a==itk::SpatialOrientation::ITK_COORDINATE_Inferior) || 
50       (a==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
51     if ((b==itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
52         (b==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
53       return false;
54     }
55   }
56   return true;
57 }
58 //====================================================================
59
60 //====================================================================
61 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
62 {
63   itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
64   itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
65   itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
66
67   if (CheckOrientation(f1, f2) && CheckOrientation(f2,f3) && CheckOrientation(f1,f3)) {
68     return static_cast<itk::SpatialOrientation::ValidCoordinateOrientationFlags>(
69                                                                                  (f1     << itk::SpatialOrientation::ITK_COORDINATE_PrimaryMinor) 
70                                                                                  + (f2  << itk::SpatialOrientation::ITK_COORDINATE_SecondaryMinor)
71                                                                                  + (f3 << itk::SpatialOrientation::ITK_COORDINATE_TertiaryMinor));
72   }
73   std::cerr <<"I don't know the orientation '" << a << b << c 
74             << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
75   exit(0);
76 }
77 //====================================================================
78
79 //====================================================================
80 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
81 {
82   if (orient.size() >= 3) return GetOrientation(orient[0], orient[1], orient[2]);
83   std::cerr <<"I don't know the orientation '" << orient 
84             << "'. Valid string are three letters LR/AP/IS (or in lowercase)" << std::endl;
85   exit(0);
86 }
87 //====================================================================
88
89 //====================================================================
90 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
91 {
92   if (i==0) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 24) >> 24);
93   if (i==1) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 16) >> 24);
94   if (i==2) return static_cast<itk::SpatialOrientation::CoordinateTerms>(orient >> 16);
95   std::cerr <<"Invalid index = " << i << " in GetOrientation" << std::endl;
96   exit(0);
97 }
98 //====================================================================
99
100 //====================================================================
101 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag) {
102   if (dim ==0) {
103     for(int i=0; i<3; i++) {
104       int j = GetOrientation(i, flag);
105       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Right) || 
106           (j == itk::SpatialOrientation::ITK_COORDINATE_Left)) return i;
107     }
108   }     
109   if (dim ==1) {
110     for(int i=0; i<3; i++) {
111       int j = GetOrientation(i, flag);
112       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Anterior) || 
113           (j == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return i;
114     }
115   }     
116   if (dim ==2) {
117     for(int i=0; i<3; i++) {
118       int j = GetOrientation(i, flag);
119       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Superior) || 
120           (j == itk::SpatialOrientation::ITK_COORDINATE_Inferior)) return i;
121     }
122   }     
123   return 0; // just to avoid warning
124 }
125 //====================================================================
126
127 //====================================================================
128 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
129 {
130   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Right) || 
131       (t == itk::SpatialOrientation::ITK_COORDINATE_Left)) return 0;
132   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
133       (t == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return 1;
134   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Inferior) || 
135       (t == itk::SpatialOrientation::ITK_COORDINATE_Superior)) return 2;
136   std::cerr <<"Invalid CoordinateTerms = " << t << std::endl;
137   exit(0);
138 }
139 //====================================================================
140
141 //====================================================================
142 void clitk::FlipPoint(const itk::Point<double, 3> in, 
143                       const itk::SpatialOrientation::ValidCoordinateOrientationFlags inFlag, 
144                       const itk::SpatialOrientation::ValidCoordinateOrientationFlags outFlag, 
145                       const itk::Point<double, 3> & imageSize,
146                       itk::Point<double, 3> & out)
147 {
148   for(int i=0; i<3; i++) {
149     // DD(i);
150     itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
151     // DD(inT);
152     int inDim = GetDim(inT);
153     // DD(inDim);
154     int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
155     // DD(outDim);
156     //  DD(in[i]);
157     if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
158     else out[outDim] = imageSize[i]-in[i];
159     // DD(out[outDim]);
160   }
161 }
162 //====================================================================
163
164 #endif /* end #define CLITKORIENTATION_CXX */
165