RxDock 0.1.0
A fast, versatile, and open-source program for docking ligands to proteins and nucleic acids
Loading...
Searching...
No Matches
Quat.h
1/***********************************************************************
2 * The rDock program was developed from 1998 - 2006 by the software team
3 * at RiboTargets (subsequently Vernalis (R&D) Ltd).
4 * In 2006, the software was licensed to the University of York for
5 * maintenance and distribution.
6 * In 2012, Vernalis and the University of York agreed to release the
7 * program as Open Source software.
8 * This version is licensed under GNU-LGPL version 3.0 with support from
9 * the University of Barcelona.
10 * http://rdock.sourceforge.net/
11 ***********************************************************************/
12
13// Simple class for handling quaternions
14
15#ifndef _RBTQUAT_H_
16#define _RBTQUAT_H_
17
18#include <cmath> //for sqrt
19
20#include "rxdock/Coord.h"
21
22namespace rxdock {
23
24class Quat {
26 // Data members
28 //(leave public so we don't need
29 // to write accessor functions)
30public:
31 double s; // Scalar component
32 Vector v; // Vector component
33
34 friend void to_json(json &j, const Quat &quat) {
35 j = json{{"scalar", quat.s}, {"vector", quat.v}};
36 };
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);
40 };
41
43 // Constructors/destructors:
45public:
46 // Default constructor (corresponds to no rotation (null transformation))
47 inline Quat() : s(1.0), v(0.0, 0.0, 0.0) {}
48
49 // Constructor with initial values (vector component passed as 3 Double's)
50 inline Quat(double s1, double vx, double vy, double vz)
51 : s(s1), v(vx, vy, vz) {}
52
53 // Constructor with initial values (vector component passed as Vector)
54 // CAUTION: Argument types are the reverse of below
55 inline Quat(double s1, const Vector &v1) : s(s1), v(v1) {}
56
57 // Constructor accepting a rotation axis and rotation angle (radians).
58 // CAUTION: Argument types are the reverse of above
59 inline Quat(const Vector &axis, double phi) {
60 double halfPhi(0.5 * phi);
61 s = std::cos(halfPhi);
62 v = std::sin(halfPhi) * axis.Unit();
63 }
64
65 // Destructor
66 virtual ~Quat() {}
67
68 // Copy constructor
69 inline Quat(const Quat &quat) {
70 s = quat.s;
71 v = quat.v;
72 }
73
75 // Operator functions:
77
78 // Copy assignment (*this = coord)
79 inline Quat &operator=(const Quat &quat) {
80 if (this != &quat) { // beware of self-assignment
81 s = quat.s;
82 v = quat.v;
83 }
84 return *this;
85 }
86
87 //*this += quat
88 inline void operator+=(const Quat &quat) {
89 s += quat.s;
90 v += quat.v;
91 }
92
93 //*this -= quat
94 inline void operator-=(const Quat &quat) {
95 s -= quat.s;
96 v -= quat.v;
97 }
98
99 //*this *= const
100 inline void operator*=(const double &d) {
101 s *= d;
102 v *= d;
103 }
104
105 //*this /= const
106 inline void operator/=(const double &d) {
107 s /= d;
108 v /= d;
109 }
110
112 // Friend functions:
114
115 // Insertion operator
116 friend std::ostream &operator<<(std::ostream &s, const Quat &quat) {
117 return s << quat.s << "," << quat.v;
118 }
119
120 // Equality
121 inline friend bool operator==(const Quat &quat1, const Quat &quat2) {
122 return quat1.s == quat2.s && quat1.v == quat2.v;
123 }
124
125 // Non-equality
126 inline friend bool operator!=(const Quat &quat1, const Quat &quat2) {
127 return quat1.s != quat2.s || quat1.v != quat2.v;
128 }
129
130 // Addition
131 inline friend Quat operator+(const Quat &quat1, const Quat &quat2) {
132 return Quat(quat1.s + quat2.s, quat1.v + quat2.v);
133 }
134
135 // Subtraction
136 inline friend Quat operator-(const Quat &quat1, const Quat &quat2) {
137 return Quat(quat1.s - quat2.s, quat1.v - quat2.v);
138 }
139
140 // Negation
141 inline friend Quat operator-(const Quat &quat) {
142 return Quat(-quat.s, -quat.v);
143 }
144
145 // Multiplication (non-commutative)
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));
150 }
151
152 // Scalar product
153 inline friend Quat operator*(const Quat &quat, const double &d) {
154 return Quat(quat.s * d, quat.v * d);
155 }
156
157 // Scalar product
158 inline friend Quat operator*(const double &d, const Quat &quat) {
159 return Quat(quat.s * d, quat.v * d);
160 }
161
162 // Scalar division
163 inline friend Quat operator/(const Quat &quat, const double &d) {
164 return Quat(quat.s / d, quat.v / d);
165 }
166
168 // Public methods
170
171 // Returns magnitude of quat
172 // Member function (L = Q1.Length())
173 inline double Length() const { return std::sqrt(s * s + v.Length2()); }
174
175 // Returns unit quat
176 // Member function (U1 = Q1.Unit())
177 inline Quat Unit() const {
178 double l = Length();
179 return (l > 0) ? *this / l : *this;
180 }
181
182 // Dot product member function (D = Q1.Dot(Q2))
183 inline double Dot(const Quat &quat) const {
184 return s * quat.s + v.Dot(quat.v);
185 }
186
187 // Returns conjugate
188 // Member function (Q1* = Q1.Conj())
189 inline Quat Conj() const { return Quat(s, -v); }
190
191 // Returns Q W Q* where Q=S+V is a quaternion and W is a 3-D vector
192 // Q W Q* = (S^2 - V.V)W + 2S(VxW) + 2V(V.W)
193 // where . = Dot product and x = Cross product
194 // The end result is a 3-D rotation, assuming q has been obtained from
195 // RotationQuat
196 inline Coord Rotate(const Coord &w) const {
197 return (s * s - v.Dot(v)) * w + 2 * s * v.Cross(w) + 2 * v * v.Dot(w);
198 }
199};
200
201// Useful typedefs
202typedef std::vector<Quat> QuatList; // Vector of quats
203typedef QuatList::iterator QuatListIter;
204typedef QuatList::const_iterator QuatListConstIter;
205
207// Non-member functions (in rxdock namespace)
209
210// Returns magnitude of quat (L = Length(Q1))
211inline double Length(const Quat &quat) { return quat.Length(); }
212
213// Returns unit quat (U1 = Unit(Q1))
214inline Quat Unit(const Quat &quat) { return quat.Unit(); }
215
216// Dot product (D = Dot(Q1,Q2))
217inline double Dot(const Quat &quat1, const Quat &quat2) {
218 return quat1.Dot(quat2);
219}
220
221// Returns conjugate (Q1* = Conj(Q1))
222inline Quat Conj(const Quat &quat) { return quat.Conj(); }
223
224} // namespace rxdock
225
226#endif //_RBTQUAT_H_
Definition Coord.h:45
Definition Quat.h:24