20#include "rxdock/Coord.h"
34 friend void to_json(json &j,
const Quat &quat) {
35 j = json{{
"scalar", quat.s}, {
"vector", quat.v}};
37 friend void from_json(
const json &j,
Quat &quat) {
38 j.at(
"scalar").get_to(quat.s);
39 j.at(
"vector").get_to(quat.v);
47 inline Quat() : s(1.0), v(0.0, 0.0, 0.0) {}
50 inline Quat(
double s1,
double vx,
double vy,
double vz)
51 : s(s1), v(vx, vy, vz) {}
55 inline Quat(
double s1,
const Vector &v1) : s(s1), v(v1) {}
60 double halfPhi(0.5 * phi);
61 s = std::cos(halfPhi);
62 v = std::sin(halfPhi) * axis.Unit();
79 inline Quat &operator=(
const Quat &quat) {
88 inline void operator+=(
const Quat &quat) {
94 inline void operator-=(
const Quat &quat) {
100 inline void operator*=(
const double &d) {
106 inline void operator/=(
const double &d) {
116 friend std::ostream &operator<<(std::ostream &s,
const Quat &quat) {
117 return s << quat.s <<
"," << quat.v;
121 inline friend bool operator==(
const Quat &quat1,
const Quat &quat2) {
122 return quat1.s == quat2.s && quat1.v == quat2.v;
126 inline friend bool operator!=(
const Quat &quat1,
const Quat &quat2) {
127 return quat1.s != quat2.s || quat1.v != quat2.v;
131 inline friend Quat operator+(
const Quat &quat1,
const Quat &quat2) {
132 return Quat(quat1.s + quat2.s, quat1.v + quat2.v);
136 inline friend Quat operator-(
const Quat &quat1,
const Quat &quat2) {
137 return Quat(quat1.s - quat2.s, quat1.v - quat2.v);
141 inline friend Quat operator-(
const Quat &quat) {
142 return Quat(-quat.s, -quat.v);
146 inline friend Quat operator*(
const Quat &quat1,
const Quat &quat2) {
147 return Quat(quat1.s * quat2.s - (quat1.v).Dot(quat2.v),
148 quat1.s * quat2.v + quat1.v * quat2.s +
149 (quat1.v).Cross(quat2.v));
153 inline friend Quat operator*(
const Quat &quat,
const double &d) {
154 return Quat(quat.s * d, quat.v * d);
158 inline friend Quat operator*(
const double &d,
const Quat &quat) {
159 return Quat(quat.s * d, quat.v * d);
163 inline friend Quat operator/(
const Quat &quat,
const double &d) {
164 return Quat(quat.s / d, quat.v / d);
173 inline double Length()
const {
return std::sqrt(s * s + v.Length2()); }
177 inline Quat Unit()
const {
179 return (l > 0) ? *
this / l : *
this;
183 inline double Dot(
const Quat &quat)
const {
184 return s * quat.s + v.Dot(quat.v);
189 inline Quat Conj()
const {
return Quat(s, -v); }
197 return (s * s - v.Dot(v)) * w + 2 * s * v.Cross(w) + 2 * v * v.Dot(w);
202typedef std::vector<Quat> QuatList;
203typedef QuatList::iterator QuatListIter;
204typedef QuatList::const_iterator QuatListConstIter;
211inline double Length(
const Quat &quat) {
return quat.Length(); }
214inline Quat Unit(
const Quat &quat) {
return quat.Unit(); }
217inline double Dot(
const Quat &quat1,
const Quat &quat2) {
218 return quat1.Dot(quat2);
222inline Quat Conj(
const Quat &quat) {
return quat.Conj(); }