STIR 6.4.0
Quaternion.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2000- 2005, Hammersmith Imanet Ltd
5 SPDX-License-Identifier: Apache-2.0
6 See STIR/LICENSE.txt for details
7*/
17
18START_NAMESPACE_STIR
19
20template <typename coordT>
21coordT
22norm_squared(const Quaternion<coordT>& q)
23{
24 return square(q[1]) + square(q[2]) + square(q[3]) + square(q[4]);
25}
26
27template <typename coordT>
28coordT
29norm(const Quaternion<coordT>& q)
30{
31 return sqrt(norm_squared(q));
32}
33
34template <typename coordT>
35coordT
36Quaternion<coordT>::dot_product(const Quaternion<coordT>& q1, const Quaternion<coordT>& q2)
37{
38 return ((q1[1] * q2[1]) + (q1[2] * q2[2]) + (q1[3] * q2[3]) + (q1[4] * q2[4]));
39}
40
41template <typename coordT>
42Quaternion<coordT>&
43Quaternion<coordT>::operator*=(const Quaternion<coordT>& q)
44{
45 const Quaternion<coordT> tmp(*this);
46 (*this)[1] = tmp[1] * q[1] - tmp[2] * q[2] - tmp[3] * q[3] - tmp[4] * q[4];
47 (*this)[2] = tmp[1] * q[2] + tmp[2] * q[1] + tmp[3] * q[4] - tmp[4] * q[3];
48 (*this)[3] = tmp[1] * q[3] + tmp[3] * q[1] + tmp[4] * q[2] - tmp[2] * q[4];
49 (*this)[4] = tmp[1] * q[4] + tmp[4] * q[1] + tmp[2] * q[3] - tmp[3] * q[2];
50
51 return *this;
52}
53
54template <typename coordT>
55Quaternion<coordT>&
56Quaternion<coordT>::operator*=(const coordT& a)
57{
58 for (int i = 1; i <= 4; i++)
59 (*this)[i] *= a;
60 return *this;
61}
62
63template <typename coordT>
64Quaternion<coordT>
65Quaternion<coordT>::operator*(const Quaternion& q) const
66{
67 Quaternion<coordT> tmp(*this);
68 tmp *= q;
69
70 return tmp;
71}
72
73template <typename coordT>
74Quaternion<coordT>
75Quaternion<coordT>::operator*(const coordT& a) const
76{
77 Quaternion<coordT> tmp(*this);
78 tmp *= a;
79 return tmp;
80}
81
82template <typename coordT>
83Quaternion<coordT>&
84Quaternion<coordT>::operator/=(const coordT& a)
85{
86 for (int i = 1; i <= 4; i++)
87 (*this)[i] /= a;
88 return *this;
89}
90template <typename coordT>
91Quaternion<coordT>&
92Quaternion<coordT>::operator/=(const Quaternion& q)
93{
94 const Quaternion<coordT> con_q(q[1], -q[2], -q[3], -q[4]);
95 const coordT norm_squared = (square(q[1]) + square(q[2]) + square(q[3]) + square(q[4]));
96 *this *= con_q;
97 *this /= norm_squared;
98
99 return *this;
100}
101
102template <typename coordT>
103Quaternion<coordT>
104Quaternion<coordT>::operator/(const Quaternion& q) const
105{
106 Quaternion<coordT> tmp(*this);
107 tmp /= q;
108 return tmp;
109}
110
111template <typename coordT>
112Quaternion<coordT>
113Quaternion<coordT>::operator/(const coordT& a) const
114{
115 Quaternion<coordT> tmp(*this);
116 tmp /= a;
117 return tmp;
118}
119
120template <typename coordT>
121void
122Quaternion<coordT>::neg_quaternion()
123{
124 (*this)[1] = -(*this)[1];
125 (*this)[2] = -(*this)[2];
126 (*this)[3] = -(*this)[3];
127 (*this)[4] = -(*this)[4];
128}
129
130template <typename coordT>
131void
132Quaternion<coordT>::conjugate()
133{
134 // (*this)[1] =(*this)[1];
135 (*this)[2] = -(*this)[2];
136 (*this)[3] = -(*this)[3];
137 (*this)[4] = -(*this)[4];
138}
139
140template <typename coordT>
141void
142Quaternion<coordT>::normalise()
143{
144 const coordT n = norm(*this);
145 (*this)[1] /= n;
146 (*this)[2] /= n;
147 (*this)[3] /= n;
148 (*this)[4] /= n;
149}
150
151template <typename coordT>
152void
153Quaternion<coordT>::inverse()
154{
155 const coordT dp = norm_squared(*this);
156 (*this)[1] = (*this)[1] / dp;
157 (*this)[2] = -(*this)[2] / dp;
158 (*this)[3] = -(*this)[3] / dp;
159 (*this)[4] = -(*this)[4] / dp;
160}
161
162template <typename coordT>
163Quaternion<coordT>
164conjugate(const Quaternion<coordT>& q)
165{
166 Quaternion<coordT> tmp = q;
167 tmp.conjugate();
168 return tmp;
169}
170
171template <typename coordT>
172Quaternion<coordT>
173inverse(const Quaternion<coordT>& q)
174{
175 Quaternion<coordT> tmp = q;
176 tmp.inverse();
177 return tmp;
178}
179
180END_NAMESPACE_STIR
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
double norm_squared(const BasicCoordinate< num_dimensions, coordT > &p1)
compute (inner_product(p1,p1))
Definition BasicCoordinate.inl:415
NUMBER square(const NUMBER &x)
returns the square of a number, templated.
Definition common.h:154