SIRF  3.5.0
AffineTransformation.h
Go to the documentation of this file.
1 /*
2 SyneRBI Synergistic Image Reconstruction Framework (SIRF)
3 Copyright 2017 - 2020 University College London
4 
5 This is software developed for the Collaborative Computational
6 Project in Synergistic Reconstruction for Biomedical Imaging (formerly CCP PETMR)
7 (http://www.ccpsynerbi.ac.uk/).
8 
9 Licensed under the Apache License, Version 2.0 (the "License");
10 you may not use this file except in compliance with the License.
11 You may obtain a copy of the License at
12 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 
19 */
20 
29 #pragma once
30 
31 #include <vector>
32 #include <nifti1_io.h>
34 #include <array>
35 
36 namespace sirf {
37 
38 // Forward declarations
39 template<class dataType> class Quaternion;
40 
47 template<class dataType>
48 class AffineTransformation : public Transformation<dataType>
49 {
50 public:
51 
53  static void print(const std::vector<AffineTransformation<dataType> > &mats);
54  static std::string get(const std::vector<AffineTransformation<dataType> > &mats);
55 
58 
60  AffineTransformation(const dataType tm[4][4]);
61 
63  AffineTransformation(const std::string &filename);
64 
66  AffineTransformation(const mat44 &tm);
67 
70  AffineTransformation(const std::array<dataType,3> &trans, const Quaternion<dataType> &quat);
71 
73  AffineTransformation(const std::array<dataType,3> &trans, const std::array<dataType,3> &euler, const bool degrees = true);
74 
77 
80 
82  bool operator==(const AffineTransformation &other) const;
83 
85  bool operator!=(const AffineTransformation &other) const;
86 
89 
91  dataType const *operator [](unsigned i) const { return _tm[i]; }
92 
94  dataType *operator [](unsigned i) { return _tm[i]; }
95 
97  mat44 get_as_mat44() const;
98 
101 
107  virtual NiftiImageData3DDeformation<dataType> get_as_deformation_field(const NiftiImageData<dataType> &ref, const bool use_ref = true) const;
108 
110  virtual AffineTransformation deep_copy() const;
111 
113  virtual void write(const std::string &filename) const;
114 
116  dataType get_determinant() const;
117 
119  void print() const;
120 
123 
125  const std::array<dataType,3> get_Euler_angles() const;
126 
129 
131  bool is_rigid() const;
132 
134  static AffineTransformation get_average(const std::vector<AffineTransformation<dataType> > &mats);
135 
136 protected:
137  dataType _tm[4][4];
138 };
139 }
Base class for transformations.
Class for affine transformations.
Definition: AffineTransformation.h:49
void print() const
Print.
Definition: AffineTransformation.cpp:336
virtual ~AffineTransformation()
Destructor.
Definition: AffineTransformation.h:100
virtual AffineTransformation deep_copy() const
Deep copy.
Definition: AffineTransformation.cpp:295
static void print(const std::vector< AffineTransformation< dataType > > &mats)
Print multiple AffineTransformation.
bool is_rigid() const
Is rigid? If so, determinant will be +/- 1.
Definition: AffineTransformation.cpp:378
dataType const * operator[](unsigned i) const
Overload [] operator (const)
Definition: AffineTransformation.h:91
AffineTransformation()
Default constructor - identity matrix.
Definition: AffineTransformation.cpp:118
AffineTransformation & operator=(const AffineTransformation &to_copy)
Assignment.
Definition: AffineTransformation.cpp:68
virtual void write(const std::string &filename) const
Save to file.
Definition: AffineTransformation.cpp:306
virtual NiftiImageData3DDeformation< dataType > get_as_deformation_field(const NiftiImageData< dataType > &ref, const bool use_ref=true) const
Definition: AffineTransformation.cpp:284
mat44 get_as_mat44() const
Get raw mat44.
Definition: AffineTransformation.cpp:274
bool operator!=(const AffineTransformation &other) const
Equality operator.
Definition: AffineTransformation.cpp:251
const std::array< dataType, 3 > get_Euler_angles() const
Get Euler angles (XYZ)
Definition: AffineTransformation.cpp:349
static AffineTransformation get_average(const std::vector< AffineTransformation< dataType > > &mats)
Average transformation matrices (using quaternions for rotation component)
Definition: AffineTransformation.cpp:384
AffineTransformation get_inverse() const
Get inverse.
Definition: AffineTransformation.cpp:342
bool operator==(const AffineTransformation &other) const
Equality operator.
Definition: AffineTransformation.cpp:237
AffineTransformation operator*(const AffineTransformation &other) const
Multiplication operator.
Definition: AffineTransformation.cpp:258
dataType get_determinant() const
Get determinant.
Definition: AffineTransformation.cpp:328
Quaternion< dataType > get_quaternion() const
Get quaternion.
Definition: AffineTransformation.cpp:372
Class for deformation SIRF image data.
Definition: NiftiImageData3DDeformation.h:55
Definition: NiftiImageData.h:78
Class for quaternions.
Definition: Quaternion.h:47
Forward declarations.
Definition: Transformation.h:52
Abstract data container.
Definition: GeometricalInfo.cpp:141