1 /*=========================================================================
4 Module: $RCSfile: clitkOrientation.cxx,v $
6 Date: $Date: 2010/01/06 13:32:01 $
7 Version: $Revision: 1.1 $
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.
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.
17 =========================================================================*/
19 #ifndef CLITKORIENTATION_CXX
20 #define CLITKORIENTATION_CXX
23 =================================================
24 * @file clitkOrientation.cxx
25 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
26 * @date 01 Nov 2006 18:02:49
31 =================================================*/
33 #include "clitkOrientation.h"
35 //====================================================================
36 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
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;
48 //====================================================================
50 //====================================================================
51 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
52 itk::SpatialOrientation::CoordinateTerms b)
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)) {
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)) {
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)) {
77 //====================================================================
79 //====================================================================
80 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
82 itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
83 itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
84 itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
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));
92 std::cerr <<"I don't know the orientation '" << a << b << c
93 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
96 //====================================================================
98 //====================================================================
99 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
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;
106 //====================================================================
108 //====================================================================
109 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
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;
117 //====================================================================
119 //====================================================================
120 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag) {
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;
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;
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;
142 return 0; // just to avoid warning
144 //====================================================================
146 //====================================================================
147 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
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;
158 //====================================================================
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)
167 for(int i=0; i<3; i++) {
169 itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
171 int inDim = GetDim(inT);
173 int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
176 if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
177 else out[outDim] = imageSize[i]-in[i];
181 //====================================================================
183 #endif /* end #define CLITKORIENTATION_CXX */