]> Creatis software - clitk.git/blob - common/clitkOrientation.cxx
*** empty log message ***
[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 {
120   if (dim ==0) {
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;
125     }
126   }
127   if (dim ==1) {
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;
132     }
133   }
134   if (dim ==2) {
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;
139     }
140   }
141   return 0; // just to avoid warning
142 }
143 //====================================================================
144
145 //====================================================================
146 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
147 {
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;
155   exit(0);
156 }
157 //====================================================================
158
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)
165 {
166   for(int i=0; i<3; i++) {
167     // DD(i);
168     itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
169     // DD(inT);
170     int inDim = GetDim(inT);
171     // DD(inDim);
172     int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
173     // DD(outDim);
174     //  DD(in[i]);
175     if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
176     else out[outDim] = imageSize[i]-in[i];
177     // DD(out[outDim]);
178   }
179 }
180 //====================================================================
181
182 #endif /* end #define CLITKORIENTATION_CXX */
183