1 /*=========================================================================
2  *
3  *  Copyright Insight Software Consortium
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *         http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *=========================================================================*/
18 
19 #include <iostream>
20 
21 #include "itkIdentityTransform.h"
22 #include "itkTestingMacros.h"
23 
itkIdentityTransformTest(int,char * [])24 int itkIdentityTransformTest(int, char *[] )
25 {
26 
27   std::cout << "==================================" << std::endl;
28   std::cout << "Testing Identity Transform " << std::endl << std::endl;
29 
30   const double       epsilon = 1e-10;
31   constexpr unsigned int N = 2;
32   bool               Ok = true;
33 
34   using IdentityTransformType = itk::IdentityTransform<double>;
35   IdentityTransformType::Pointer transform = IdentityTransformType::New();
36 
37   std::cout << "Testing TransformPoint: ";
38   IdentityTransformType::InputPointType   p( 10 );
39   IdentityTransformType::OutputPointType  r;
40 
41   r = transform->TransformPoint( p );
42   for( unsigned int i = 0; i < N; i++ )
43     {
44     if( std::fabs( p[i] - r[i] ) > epsilon )
45       {
46       Ok = false;
47       break;
48       }
49     }
50   if( !Ok )
51     {
52     std::cerr << "Error Transforming Point" << std::endl;
53     return EXIT_FAILURE;
54     }
55   else
56     {
57     std::cout << " [ PASSED ] " << std::endl;
58     }
59 
60   // Test TransformVector
61   std::cout << "Testing TransformVector: ";
62   IdentityTransformType::InputVectorType vin;
63   vin[0] = 1;
64   vin[1] = 2;
65   IdentityTransformType::OutputVectorType vout;
66 
67   vout = transform->TransformVector( vin );
68   for( unsigned int i = 0; i < N; i++ )
69     {
70     if( std::fabs( vout[i] - vin[i] ) > epsilon )
71       {
72       Ok = false;
73       break;
74       }
75     }
76   if( !Ok )
77     {
78     std::cerr << "Error with TransformVector itk::Vector" << std::endl;
79     return EXIT_FAILURE;
80     }
81   else
82     {
83     std::cout << " [ PASSED ] " << std::endl;
84     }
85 
86   // Test TransformVector vnl_vector
87   std::cout << "Testing TransformVector (vnl): ";
88   IdentityTransformType::InputVnlVectorType vnlin;
89   vnlin[0] = 1;
90   vnlin[1] = 2;
91   IdentityTransformType::OutputVnlVectorType vnlout;
92 
93   vnlout = transform->TransformVector( vnlin );
94   for( unsigned int i = 0; i < N; i++ )
95     {
96     if( std::fabs( vnlout[i] - vnlin[i] ) > epsilon )
97       {
98       Ok = false;
99       break;
100       }
101     }
102   if( !Ok )
103     {
104     std::cerr << "Error with TransformVector vnlVector" << std::endl;
105     return EXIT_FAILURE;
106     }
107   else
108     {
109     std::cout << " [ PASSED ] " << std::endl;
110     }
111 
112   // Test TransformCovariantVector
113   std::cout << "Testing TransformCovariantVector: ";
114   IdentityTransformType::InputCovariantVectorType vcin;
115   vcin[0] = 1;
116   vcin[1] = 2;
117   IdentityTransformType::OutputCovariantVectorType vcout;
118 
119   vcout = transform->TransformCovariantVector( vcin );
120   for( unsigned int i = 0; i < N; i++ )
121     {
122     if( std::fabs( vcout[i] - vcin[i] ) > epsilon )
123       {
124       Ok = false;
125       break;
126       }
127     }
128   if( !Ok )
129     {
130     std::cerr << "Error with TransformVector CovariantVector" << std::endl;
131     return EXIT_FAILURE;
132     }
133   else
134     {
135     std::cout << " [ PASSED ] " << std::endl;
136     }
137 
138   // Test the Set/Get Parameters
139   std::cout << "Testing Set/GetParameters():";
140   IdentityTransformType::ParametersType params(0);
141   transform->SetParameters(params);
142   std::cout << " [ PASSED ] " << std::endl;
143 
144   // Test the GetNumberOfParameters() method
145   std::cout << "Testing GetNumberOfParameters():";
146   unsigned int numParams = transform->GetNumberOfParameters();
147   if( numParams != 0 )
148     {
149     std::cerr << "Error with GetNumberOfParameters" << std::endl;
150     return EXIT_FAILURE;
151     }
152   else
153     {
154     std::cout << " [ PASSED ] " << std::endl;
155     }
156 
157   // Testing the Jacobian
158   std::cout << "Testing Jacobian: ";
159   IdentityTransformType::JacobianType jacobian;
160   transform->ComputeJacobianWithRespectToParameters(p, jacobian);
161 
162   if( jacobian.rows() != 3 || jacobian.columns() != 0 )
163     {
164     std::cerr << "Error with Jacobian: " << jacobian << std::endl;
165     return EXIT_FAILURE;
166     }
167   else
168     {
169     std::cout << " [ PASSED ] " << std::endl;
170     }
171 
172   IdentityTransformType::Pointer inv = IdentityTransformType::New();
173   TEST_EXPECT_TRUE(transform->GetInverse(inv));
174   TEST_EXPECT_TRUE(!transform->GetInverse(nullptr));
175 
176   return EXIT_SUCCESS;
177 
178 }
179