1 /*=========================================================================
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.
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.
14 =========================================================================*/
16 #ifndef CLITKORIENTATION_CXX
17 #define CLITKORIENTATION_CXX
20 =================================================
21 * @file clitkOrientation.cxx
22 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
23 * @date 01 Nov 2006 18:02:49
28 =================================================*/
30 #include "clitkOrientation.h"
32 //====================================================================
33 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
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;
45 //====================================================================
47 //====================================================================
48 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
49 itk::SpatialOrientation::CoordinateTerms b)
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)) {
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)) {
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)) {
74 //====================================================================
76 //====================================================================
77 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
79 itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
80 itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
81 itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
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));
89 std::cerr <<"I don't know the orientation '" << a << b << c
90 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
93 //====================================================================
95 //====================================================================
96 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
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;
103 //====================================================================
105 //====================================================================
106 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
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;
114 //====================================================================
116 //====================================================================
117 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag) {
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;
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;
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;
139 return 0; // just to avoid warning
141 //====================================================================
143 //====================================================================
144 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
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;
155 //====================================================================
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)
164 for(int i=0; i<3; i++) {
166 itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
168 int inDim = GetDim(inT);
170 int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
173 if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
174 else out[outDim] = imageSize[i]-in[i];
178 //====================================================================
180 #endif /* end #define CLITKORIENTATION_CXX */