quatd.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
25 // This file is generated by a script. Do not edit directly. Edit the
26 // quat.template.h file to make changes.
27 
28 #ifndef PXR_BASE_GF_QUATD_H
29 #define PXR_BASE_GF_QUATD_H
30 
33 
34 #include "pxr/pxr.h"
35 #include "pxr/base/gf/api.h"
36 #include "pxr/base/gf/declare.h"
37 #include "pxr/base/gf/vec3d.h"
38 #include "pxr/base/gf/traits.h"
39 
40 #include <boost/functional/hash.hpp>
41 
42 #include <iosfwd>
43 
44 PXR_NAMESPACE_OPEN_SCOPE
45 
46 template <>
47 struct GfIsGfQuat<class GfQuatd> { static const bool value = true; };
48 
49 
51 double GfDot(const GfQuatd& q1, const GfQuatd& q2);
52 
53 
60 class GfQuatd
61 {
62  public:
63  typedef double ScalarType;
64  typedef GfVec3d ImaginaryType;
65 
67  GfQuatd() {}
68 
76  explicit GfQuatd (double realVal) : _imaginary(0), _real(realVal) {}
77 
79  GfQuatd(double real, double i, double j, double k)
80  : _imaginary(i, j, k), _real(real)
81  {
82  }
83 
85  GfQuatd(double real, const GfVec3d &imaginary)
86  : _imaginary(imaginary), _real(real)
87  {
88  }
89 
91  GF_API
92  GfQuatd(class GfQuatf const &other);
94  GF_API
95  GfQuatd(class GfQuath const &other);
96 
99  static GfQuatd GetZero() { return GfQuatd(0.0); }
100 
103  static GfQuatd GetIdentity() { return GfQuatd(1.0); }
104 
106  double GetReal() const { return _real; }
107 
109  void SetReal(double real) { _real = real; }
110 
112  const GfVec3d &GetImaginary() const { return _imaginary; }
113 
115  void SetImaginary(const GfVec3d &imaginary) {
116  _imaginary = imaginary;
117  }
118 
120  void SetImaginary(double i, double j, double k) {
121  _imaginary.Set(i, j, k);
122  }
123 
125  double GetLength() const { return GfSqrt(_GetLengthSquared()); }
126 
129  GfQuatd
130  GetNormalized(double eps = GF_MIN_VECTOR_LENGTH) const {
131  GfQuatd ret(*this);
132  ret.Normalize(eps);
133  return ret;
134  }
135 
139  GF_API
140  double Normalize(double eps = GF_MIN_VECTOR_LENGTH);
141 
145  return GfQuatd(GetReal(), -GetImaginary());
146  }
147 
150  GfQuatd GetInverse() const {
151  return GetConjugate() / _GetLengthSquared();
152  }
153 
161  GF_API
162  GfVec3d Transform(const GfVec3d& point) const;
163 
165  friend inline size_t hash_value(const GfQuatd &q) {
166  size_t h = boost::hash<ScalarType>()(q.GetReal());
167  boost::hash_combine(h, q.GetImaginary());
168  return h;
169  }
170 
172  GfQuatd operator-() const {
173  return GfQuatd(-GetReal(), -GetImaginary());
174  }
175 
178  bool operator==(const GfQuatd &q) const {
179  return (GetReal() == q.GetReal() &&
180  GetImaginary() == q.GetImaginary());
181  }
182 
185  bool operator!=(const GfQuatd &q) const {
186  return !(*this == q);
187  }
188 
190  GF_API
191  GfQuatd &operator *=(const GfQuatd &q);
192 
194  GfQuatd &operator *=(double s) {
195  _real *= s;
196  _imaginary *= s;
197  return *this;
198  }
199 
201  GfQuatd &operator /=(double s) {
202  _real /= s;
203  _imaginary /= s;
204  return *this;
205  }
206 
209  _real += q._real;
210  _imaginary += q._imaginary;
211  return *this;
212  }
213 
216  _real -= q._real;
217  _imaginary -= q._imaginary;
218  return *this;
219  }
220 
222  friend GfQuatd
223  operator +(const GfQuatd &q1, const GfQuatd &q2) {
224  return GfQuatd(q1) += q2;
225  }
226 
228  friend GfQuatd
229  operator -(const GfQuatd &q1, const GfQuatd &q2) {
230  return GfQuatd(q1) -= q2;
231  }
232 
234  friend GfQuatd
235  operator *(const GfQuatd &q1, const GfQuatd &q2) {
236  return GfQuatd(q1) *= q2;
237  }
238 
240  friend GfQuatd
241  operator *(const GfQuatd &q, double s) {
242  return GfQuatd(q) *= s;
243  }
244 
246  friend GfQuatd
247  operator *(double s, const GfQuatd &q) {
248  return GfQuatd(q) *= s;
249  }
250 
252  friend GfQuatd
253  operator /(const GfQuatd &q, double s) {
254  return GfQuatd(q) /= s;
255  }
256 
257  private:
259  GfVec3d _imaginary;
260 
262  double _real;
263 
265  double
266  _GetLengthSquared() const {
267  return GfDot(*this, *this);
268  }
269 };
270 
275 GF_API GfQuatd
276 GfSlerp(double alpha, const GfQuatd& q0, const GfQuatd& q1);
277 
278 GF_API GfQuatd
279 GfSlerp(const GfQuatd& q0, const GfQuatd& q1, double alpha);
280 
281 inline double
282 GfDot(GfQuatd const &q1, GfQuatd const &q2) {
283  return GfDot(q1.GetImaginary(), q2.GetImaginary()) +
284  q1.GetReal()*q2.GetReal();
285 }
286 
289 GF_API std::ostream& operator<<(std::ostream &, GfQuatd const &);
290 
291 PXR_NAMESPACE_CLOSE_SCOPE
292 
293 #endif // PXR_BASE_GF_QUATD_H
GfQuatd()
Default constructor leaves the quaternion undefined.
Definition: quatd.h:67
Basic type: a quaternion, a complex number with a real coefficient and three imaginary coefficients,...
Definition: quath.h:61
void SetImaginary(double i, double j, double k)
Set the imaginary coefficients.
Definition: quatd.h:120
GfQuatd GetInverse() const
Return this quaternion's inverse, or reciprocal.
Definition: quatd.h:150
GfQuatd operator-() const
Component-wise negation.
Definition: quatd.h:172
double GfDot(const GfQuatd &q1, const GfQuatd &q2)
Return the dot (inner) product of two quaternions.
Definition: quatd.h:282
GF_API double Normalize(double eps=GF_MIN_VECTOR_LENGTH)
Normalizes this quaternion in place to unit length, returning the length before normalization.
friend GfQuatd operator *(const GfQuatd &q, double s)
Returns the product of quaternion q and scalar s.
Definition: quatd.h:241
void SetImaginary(const GfVec3d &imaginary)
Set the imaginary coefficients.
Definition: quatd.h:115
Declares Gf types.
Basic type: a quaternion, a complex number with a real coefficient and three imaginary coefficients,...
Definition: quatf.h:60
static GfQuatd GetZero()
Return the zero quaternion, with real coefficient 0 and an imaginary coefficients all zero.
Definition: quatd.h:99
GF_API GfQuatd GfSlerp(double alpha, const GfQuatd &q0, const GfQuatd &q1)
Spherically linearly interpolate between q0 and q1.
friend GfQuatd operator *(double s, const GfQuatd &q)
Returns the product of quaternion q and scalar s.
Definition: quatd.h:247
GfQuatd GetNormalized(double eps=GF_MIN_VECTOR_LENGTH) const
length of this quaternion is smaller than eps, return the identity quaternion.
Definition: quatd.h:130
GfVec3d & Set(double s0, double s1, double s2)
Set all elements with passed arguments.
Definition: vec3d.h:130
GF_API GfVec3d Transform(const GfVec3d &point) const
Transform the GfVec3d point.
static GfQuatd GetIdentity()
Return the identity quaternion, with real coefficient 1 and an imaginary coefficients all zero.
Definition: quatd.h:103
bool operator==(const GfQuatd &q) const
Component-wise quaternion equality test.
Definition: quatd.h:178
friend GfQuatd operator -(const GfQuatd &q1, const GfQuatd &q2)
Component-wise binary difference operator.
Definition: quatd.h:229
GfQuatd & operator -=(const GfQuatd &q)
Component-wise unary difference operator.
Definition: quatd.h:215
GfQuatd & operator+=(const GfQuatd &q)
Add quaternion q to this quaternion.
Definition: quatd.h:208
void SetReal(double real)
Set the real coefficient.
Definition: quatd.h:109
double GfSqrt(double f)
Return sqrt(f).
Definition: math.h:80
GfQuatd & operator *=(double s)
Multiply this quaternion's coefficients by s.
Definition: quatd.h:194
double GetReal() const
Return the real coefficient.
Definition: quatd.h:106
GF_API GfQuatd & operator *=(const GfQuatd &q)
Post-multiply quaternion q into this quaternion.
GF_API std::ostream & operator<<(std::ostream &, GfQuatd const &)
Output a GfQuatd using the format (re, i, j, k)
A metafunction with a static const bool member 'value' that is true for GfQuat types and false for al...
Definition: traits.h:47
friend GfQuatd operator *(const GfQuatd &q1, const GfQuatd &q2)
Returns the product of quaternions q1 and q2.
Definition: quatd.h:235
friend GfQuatd operator+(const GfQuatd &q1, const GfQuatd &q2)
Component-wise binary sum operator.
Definition: quatd.h:223
Basic type for a vector of 3 double components.
Definition: vec3d.h:63
friend size_t hash_value(const GfQuatd &q)
Hash.
Definition: quatd.h:165
double GetLength() const
Return geometric length of this quaternion.
Definition: quatd.h:125
Basic type: a quaternion, a complex number with a real coefficient and three imaginary coefficients,...
Definition: quatd.h:60
GfQuatd(double real, const GfVec3d &imaginary)
Initialize the real and imaginary coefficients.
Definition: quatd.h:85
GfQuatd(double realVal)
Initialize the real coefficient to realVal and the imaginary coefficients to zero.
Definition: quatd.h:76
const GfVec3d & GetImaginary() const
Return the imaginary coefficient.
Definition: quatd.h:112
GfQuatd & operator/=(double s)
Divide this quaternion's coefficients by s.
Definition: quatd.h:201
friend GfQuatd operator/(const GfQuatd &q, double s)
Returns the product of quaternion q and scalar 1 / s.
Definition: quatd.h:253
GfQuatd(double real, double i, double j, double k)
Initialize the real and imaginary coefficients.
Definition: quatd.h:79
#define GF_MIN_VECTOR_LENGTH
This constant is used to determine whether the length of a vector is too small to handle accurately.
Definition: limits.h:34
GfQuatd GetConjugate() const
Return this quaternion's conjugate, which is the quaternion with the same real coefficient and negate...
Definition: quatd.h:144
bool operator!=(const GfQuatd &q) const
Component-wise quaternion inequality test.
Definition: quatd.h:185