]> Creatis software - clitk.git/blob - common/clitkOrientation.cxx
added the new headers
[clitk.git] / common / clitkOrientation.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
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
8
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.
12
13   It is distributed under dual licence
14
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
20 /**
21    =================================================
22    * @file   clitkOrientation.cxx
23    * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
24    * @date   01 Nov 2006 18:02:49
25    * 
26    * @brief  
27    * 
28    * 
29    =================================================*/
30
31 #include "clitkOrientation.h"
32
33 //====================================================================
34 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
35 {
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;
44   exit(0);
45 }
46 //====================================================================
47
48 //====================================================================
49 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
50                              itk::SpatialOrientation::CoordinateTerms b) 
51 {
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)) {
56       return false;
57     }
58   }
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)) {
63       return false;
64     }
65   }
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)) {
70       return false;
71     }
72   }
73   return true;
74 }
75 //====================================================================
76
77 //====================================================================
78 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
79 {
80   itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
81   itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
82   itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
83
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));
89   }
90   std::cerr <<"I don't know the orientation '" << a << b << c 
91             << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
92   exit(0);
93 }
94 //====================================================================
95
96 //====================================================================
97 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
98 {
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;
102   exit(0);
103 }
104 //====================================================================
105
106 //====================================================================
107 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
108 {
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;
113   exit(0);
114 }
115 //====================================================================
116
117 //====================================================================
118 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag) {
119   if (dim ==0) {
120     for(int i=0; i<3; i++) {
121       int j = GetOrientation(i, flag);
122       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Right) || 
123           (j == itk::SpatialOrientation::ITK_COORDINATE_Left)) return i;
124     }
125   }     
126   if (dim ==1) {
127     for(int i=0; i<3; i++) {
128       int j = GetOrientation(i, flag);
129       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Anterior) || 
130           (j == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return i;
131     }
132   }     
133   if (dim ==2) {
134     for(int i=0; i<3; i++) {
135       int j = GetOrientation(i, flag);
136       if ((j == itk::SpatialOrientation::ITK_COORDINATE_Superior) || 
137           (j == itk::SpatialOrientation::ITK_COORDINATE_Inferior)) return i;
138     }
139   }     
140   return 0; // just to avoid warning
141 }
142 //====================================================================
143
144 //====================================================================
145 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
146 {
147   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Right) || 
148       (t == itk::SpatialOrientation::ITK_COORDINATE_Left)) return 0;
149   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
150       (t == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return 1;
151   if ((t == itk::SpatialOrientation::ITK_COORDINATE_Inferior) || 
152       (t == itk::SpatialOrientation::ITK_COORDINATE_Superior)) return 2;
153   std::cerr <<"Invalid CoordinateTerms = " << t << std::endl;
154   exit(0);
155 }
156 //====================================================================
157
158 //====================================================================
159 void clitk::FlipPoint(const itk::Point<double, 3> in, 
160                       const itk::SpatialOrientation::ValidCoordinateOrientationFlags inFlag, 
161                       const itk::SpatialOrientation::ValidCoordinateOrientationFlags outFlag, 
162                       const itk::Point<double, 3> & imageSize,
163                       itk::Point<double, 3> & out)
164 {
165   for(int i=0; i<3; i++) {
166     // DD(i);
167     itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
168     // DD(inT);
169     int inDim = GetDim(inT);
170     // DD(inDim);
171     int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
172     // DD(outDim);
173     //  DD(in[i]);
174     if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
175     else out[outDim] = imageSize[i]-in[i];
176     // DD(out[outDim]);
177   }
178 }
179 //====================================================================
180
181 #endif /* end #define CLITKORIENTATION_CXX */
182