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