1 #ifndef CLITKORIENTATION_CXX
2 #define CLITKORIENTATION_CXX
4 =================================================
5 * @file clitkOrientation.cxx
6 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
7 * @date 01 Nov 2006 18:02:49
12 =================================================*/
14 #include "clitkOrientation.h"
16 //====================================================================
17 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(char c)
19 if ((c == 'R') || (c == 'r')) return itk::SpatialOrientation::ITK_COORDINATE_Right;
20 if ((c == 'L') || (c == 'l')) return itk::SpatialOrientation::ITK_COORDINATE_Left;
21 if ((c == 'P') || (c == 'p')) return itk::SpatialOrientation::ITK_COORDINATE_Posterior;
22 if ((c == 'A') || (c == 'a')) return itk::SpatialOrientation::ITK_COORDINATE_Anterior;
23 if ((c == 'I') || (c == 'i')) return itk::SpatialOrientation::ITK_COORDINATE_Inferior;
24 if ((c == 'S') || (c == 's')) return itk::SpatialOrientation::ITK_COORDINATE_Superior;
25 std::cerr <<"I don't know the orientation '" << c
26 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
29 //====================================================================
31 //====================================================================
32 bool clitk::CheckOrientation(itk::SpatialOrientation::CoordinateTerms a,
33 itk::SpatialOrientation::CoordinateTerms b)
35 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Right) ||
36 (a==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
37 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Right) ||
38 (b==itk::SpatialOrientation::ITK_COORDINATE_Left)) {
42 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Posterior) ||
43 (a==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
44 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Posterior) ||
45 (b==itk::SpatialOrientation::ITK_COORDINATE_Anterior)) {
49 if ((a==itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
50 (a==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
51 if ((b==itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
52 (b==itk::SpatialOrientation::ITK_COORDINATE_Superior)) {
58 //====================================================================
60 //====================================================================
61 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(char a, char b, char c)
63 itk::SpatialOrientation::CoordinateTerms f1 = clitk::GetOrientation(a);
64 itk::SpatialOrientation::CoordinateTerms f2 = clitk::GetOrientation(b);
65 itk::SpatialOrientation::CoordinateTerms f3 = clitk::GetOrientation(c);
67 if (CheckOrientation(f1, f2) && CheckOrientation(f2,f3) && CheckOrientation(f1,f3)) {
68 return static_cast<itk::SpatialOrientation::ValidCoordinateOrientationFlags>(
69 (f1 << itk::SpatialOrientation::ITK_COORDINATE_PrimaryMinor)
70 + (f2 << itk::SpatialOrientation::ITK_COORDINATE_SecondaryMinor)
71 + (f3 << itk::SpatialOrientation::ITK_COORDINATE_TertiaryMinor));
73 std::cerr <<"I don't know the orientation '" << a << b << c
74 << "'. Valid letters are LR/AP/IS (or in lowercase)" << std::endl;
77 //====================================================================
79 //====================================================================
80 itk::SpatialOrientation::ValidCoordinateOrientationFlags clitk::GetOrientation(const std::string & orient)
82 if (orient.size() >= 3) return GetOrientation(orient[0], orient[1], orient[2]);
83 std::cerr <<"I don't know the orientation '" << orient
84 << "'. Valid string are three letters LR/AP/IS (or in lowercase)" << std::endl;
87 //====================================================================
89 //====================================================================
90 itk::SpatialOrientation::CoordinateTerms clitk::GetOrientation(const int i, const itk::SpatialOrientation::ValidCoordinateOrientationFlags orient)
92 if (i==0) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 24) >> 24);
93 if (i==1) return static_cast<itk::SpatialOrientation::CoordinateTerms>((orient << 16) >> 24);
94 if (i==2) return static_cast<itk::SpatialOrientation::CoordinateTerms>(orient >> 16);
95 std::cerr <<"Invalid index = " << i << " in GetOrientation" << std::endl;
98 //====================================================================
100 //====================================================================
101 int clitk::WhereIsDimInThisOrientation(const int dim, const itk::SpatialOrientation::ValidCoordinateOrientationFlags flag) {
103 for(int i=0; i<3; i++) {
104 int j = GetOrientation(i, flag);
105 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Right) ||
106 (j == itk::SpatialOrientation::ITK_COORDINATE_Left)) return i;
110 for(int i=0; i<3; i++) {
111 int j = GetOrientation(i, flag);
112 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
113 (j == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return i;
117 for(int i=0; i<3; i++) {
118 int j = GetOrientation(i, flag);
119 if ((j == itk::SpatialOrientation::ITK_COORDINATE_Superior) ||
120 (j == itk::SpatialOrientation::ITK_COORDINATE_Inferior)) return i;
123 return 0; // just to avoid warning
125 //====================================================================
127 //====================================================================
128 int clitk::GetDim(const itk::SpatialOrientation::CoordinateTerms t)
130 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Right) ||
131 (t == itk::SpatialOrientation::ITK_COORDINATE_Left)) return 0;
132 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Anterior) ||
133 (t == itk::SpatialOrientation::ITK_COORDINATE_Posterior)) return 1;
134 if ((t == itk::SpatialOrientation::ITK_COORDINATE_Inferior) ||
135 (t == itk::SpatialOrientation::ITK_COORDINATE_Superior)) return 2;
136 std::cerr <<"Invalid CoordinateTerms = " << t << std::endl;
139 //====================================================================
141 //====================================================================
142 void clitk::FlipPoint(const itk::Point<double, 3> in,
143 const itk::SpatialOrientation::ValidCoordinateOrientationFlags inFlag,
144 const itk::SpatialOrientation::ValidCoordinateOrientationFlags outFlag,
145 const itk::Point<double, 3> & imageSize,
146 itk::Point<double, 3> & out)
148 for(int i=0; i<3; i++) {
150 itk::SpatialOrientation::CoordinateTerms inT = GetOrientation(i, inFlag);
152 int inDim = GetDim(inT);
154 int outDim = WhereIsDimInThisOrientation(inDim, outFlag);
157 if (inT == GetOrientation(outDim, outFlag)) out[outDim] = in[i];
158 else out[outDim] = imageSize[i]-in[i];
162 //====================================================================
164 #endif /* end #define CLITKORIENTATION_CXX */