35 #include "quaternion.h"
37 #include "rotmatrix.h"
49 : m_w(0), m_vec(), m_valid(true), m_age(1)
51 CoordType norm = std::sqrt(w_in*w_in + x_in*x_in + y_in*y_in + z_in*z_in);
54 m_vec[0] = x_in / norm;
55 m_vec[1] = y_in / norm;
56 m_vec[2] = z_in / norm;
79 if (!q.m_valid || !m_valid) {
83 if(std::fabs(m_w - q.m_w) <= epsilon) {
85 for(i = 0; i < 3; ++i)
86 if(std::fabs(m_vec[i] - q.m_vec[i]) > epsilon)
93 if(std::fabs(m_w + q.m_w) <= epsilon) {
94 for(
int i = 0; i < 3; ++i)
95 if(std::fabs(m_vec[i] + q.m_vec[i]) > epsilon)
108 Quaternion& Quaternion::operator*= (
const Quaternion& rhs)
110 m_valid = m_valid && rhs.m_valid;
111 m_age = m_age + rhs.m_age;
112 checkNormalization();
115 m_w = m_w * rhs.m_w - Dot(m_vec, rhs.m_vec);
116 m_vec = old_w * rhs.m_vec + rhs.m_w * m_vec -
Cross(m_vec, rhs.m_vec);
121 Quaternion& Quaternion::operator/= (
const Quaternion& rhs)
123 m_valid = m_valid && rhs.m_valid;
124 m_age = m_age + rhs.m_age;
125 checkNormalization();
128 m_w = m_w * rhs.m_w + Dot(m_vec, rhs.m_vec);
129 m_vec = rhs.m_w * m_vec - old_w * rhs.m_vec +
Cross(m_vec, rhs.m_vec);
137 bool not_flip = !m.
parity();
139 m_valid = m.isValid();
148 const int nxt[3] = {1, 2, 0};
153 s = std::sqrt(tr + 1.0f);
157 m_vec[0] = (m_ref.
elem(2, 1) - m_ref.
elem(1, 2)) * s;
158 m_vec[1] = (m_ref.
elem(0, 2) - m_ref.
elem(2, 0)) * s;
159 m_vec[2] = (m_ref.
elem(1, 0) - m_ref.
elem(0, 1)) * s;
164 if (m_ref.
elem(1, 1) > m_ref.
elem(0, 0)) i = 1;
165 if (m_ref.
elem(2, 2) > m_ref.
elem(i, i)) i = 2;
167 int j = nxt[i], k = nxt[j];
169 s = std::sqrt (1.0f + m_ref.
elem(i, i) - m_ref.
elem(j, j) - m_ref.
elem(k, k));
170 m_vec[i] = -(s * 0.5f);
172 assert(
"sqrt() returns positive" && s > 0.0);
175 m_w = (m_ref.
elem(k, j) - m_ref.
elem(j, k)) * s;
176 m_vec[j] = (m_ref.
elem(i, j) + m_ref.
elem(j, i)) * s;
177 m_vec[k] = (m_ref.
elem(i, k) + m_ref.
elem(k, i)) * s;
205 if (axis < 0 || axis > 2) {
212 m_w = std::cos(half_angle);
213 for(
int i = 0; i < 3; ++i)
215 m_vec[i] = (i == axis) ? std::sin(half_angle) : 0;
234 m_w = std::cos(half_angle);
235 m_vec = axis * (std::sin(half_angle) / axis_mag);
237 m_valid = axis.isValid();
253 m_w = std::cos(half_angle);
254 m_vec = axis * (std::sin(half_angle) / axis_mag);
256 m_valid = axis.isValid();
265 CoordType ctheta_plus_1 = Dot(from, to) / mag_prod + 1;
277 m_w = std::sqrt(ctheta_plus_1 / 2.f);
282 m_vec =
Cross(from, to) / (2 * mag_prod * m_w);
284 m_valid = from.isValid() && to.isValid();
293 CoordType ctheta_plus_1 = Dot(from, to) / mag_prod + 1;
305 m_w = std::sqrt(ctheta_plus_1 / 2.f);
310 m_vec =
Cross(from, to) / (2 * mag_prod * m_w);
311 m_valid = from.isValid() && to.isValid();