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