1#ifndef MECACELL_QUATERNION_H
2#define MECACELL_QUATERNION_H
4#include "../utilities/utils.hpp"
6#define dispVec(v) "(" << v.x() << "," << v.y() << "," << v.z() << ")"
13 double halfangle = angle * 0.5;
15 v = n *
sin(halfangle);
18 V v2 = v0.normalized();
19 V v3 = v1.normalized();
20 double sc = min<double>(1.0, max<double>(-1.0, v2.dot(v3)));
30 Quaternion(
const double& x,
const double& y,
const double& z,
const double& ww)
31 :
v(x, y, z),
w(ww) {}
35 -
v.x() * q2.
v.z() +
v.y() * q2.
w +
v.z() * q2.
v.x() +
w * q2.
v.y(),
36 v.x() * q2.
v.y() -
v.y() * q2.
v.x() +
v.z() * q2.
w +
w * q2.
v.z(),
37 -
v.x() * q2.
v.x() -
v.y() * q2.
v.y() -
v.z() * q2.
v.z() +
w * q2.
w);
40 V vcV = 2.0 *
v.cross(vec);
41 return vec +
w * vcV +
v.cross(vcV);
46 double s =
sqrt(1.0 -
w *
w);
47 if (s == 0)
return V(1, 0, 0);
56 double magnitude =
sqrt(
w *
w +
v.x() *
v.x() +
v.y() *
v.y() +
v.z() *
v.z());
57 return Quaternion(
v.x() / magnitude,
v.y() / magnitude,
v.z() / magnitude,
61 double magnitude =
sqrt(
w *
w +
v.x() *
v.x() +
v.y() *
v.y() +
v.z() *
v.z());
62 w = min<double>(
w / magnitude, 1.0);
68 double s =
sqrt(1.0 -
w *
w);
this file contains various miscellanious utility functions & helpers *
double acos(double x)
Computes the arc cosine of a number.
double sin(double x)
Computes the sine of a number.
double sqrt(double x)
Computes the square root of a number.
double cos(double x)
Computes the cosine of a number.
Quaternion normalized() const
Quaternion(const double &x, const double &y, const double &z, const double &ww)
Quaternion(const double &angle, const V &n)
Quaternion operator*(const Quaternion &q2) const
Quaternion(const V &v0, const V &v1)
Rotation< V > toAxisAngle()
V operator*(const V &vec) const
Quaternion(const Quaternion &q)