OpenStructure
Loading...
Searching...
No Matches
quat.hh
Go to the documentation of this file.
1//------------------------------------------------------------------------------
2// This file is part of the OpenStructure project <www.openstructure.org>
3//
4// Copyright (C) 2008-2020 by the OpenStructure authors
5//
6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License as published by the Free
8// Software Foundation; either version 3.0 of the License, or (at your option)
9// any later version.
10// This library is distributed in the hope that it will be useful, but WITHOUT
11// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13// details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along with this library; if not, write to the Free Software Foundation, Inc.,
17// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18//------------------------------------------------------------------------------
19#ifndef GEOM_QUAT_HH
20#define GEOM_QUAT_HH
21
22#include <iostream>
23#include <boost/operators.hpp>
24
26
27/*
28 Unit Quaternion
29
30 math and code assembled from various places, among them:
31
32 E.B. Dam, M. Koch, M. Lillholm, Technical Report DIKU-TR-98/5,
33 Department of Computer Science, University of Copenhagen
34
35 boost quaternion example, (C) Copyright Hubert Holin 2001.
36 Distributed under the Boost Software License, Version 1.0.
37
38 Python Computer Graphics Kit, original code by Matthias Baas (C) 2004
39 Distributed under the GPL v2.0
40*/
41
42namespace geom {
43
44class Mat3;
45class Vec3;
46
48
55 private boost::additive<Quat>,
56 private boost::multiplicative<Quat, Real>,
57 private boost::multiplicative<Quat,Quat>
58{
59public:
61
62 Quat(Real w, Real x, Real y, Real z);
63
64 // initialize with a rotation (in rad) around a given axis
65 Quat(Real angle, const geom::Vec3& axis);
66
67 // initialize from a rotation matrix
68 Quat(const Mat3& rotmat);
69
70 // return 3x3 rotation matrix
72
73 Vec3 GetAxis() const;
74
75 //get angle component
76 Real GetAngle() const;
77
78 // operators
79
80 // negateable
82 // addable
83 Quat& operator+=(const Quat& q);
84 // subtractable
85 Quat& operator-=(const Quat& q);
86 // multipliable with scalar
88 // multipliable with other quat
89 Quat& operator*=(const Quat& q);
90 // dividable with scalar
92 // dividable with other quat
93 Quat& operator/=(const Quat& q);
94 // comparable
95 bool operator==(const Quat& q) const;
96 bool operator!=(const Quat& q) const { return !this->operator==(q); }
97
98 // Apply rotation to vector.
99 Vec3 Rotate(const Vec3& vec) const;
100
101
102 // these are public for direct value access
103 Real w,x,y,z;
104};
105
106
108
109// inner product
110Real DLLEXPORT_OST_GEOM Dot(const Quat& q0, const Quat& q1);
111
112// spherical linear interpolation, with t in range [0,1]
113Quat DLLEXPORT_OST_GEOM Slerp(const Quat& q0, const Quat& q1, Real t);
114
118
119//normalize quaternion
121
122DLLEXPORT_OST_GEOM std::ostream& operator<<(std::ostream& str, const Quat& q);
123
124} // ns
125
126#endif
unit quaternion
Definition quat.hh:58
Real GetAngle() const
Vec3 Rotate(const Vec3 &vec) const
Quat(const Mat3 &rotmat)
Quat & operator/=(const Quat &q)
Quat & operator/=(Real s)
Quat(Real w, Real x, Real y, Real z)
bool operator==(const Quat &q) const
bool operator!=(const Quat &q) const
Definition quat.hh:96
Quat & operator+=(const Quat &q)
Real w
Definition quat.hh:103
Vec3 GetAxis() const
Quat & operator*=(const Quat &q)
Mat3 ToRotationMatrix() const
Quat & operator*=(Real s)
Quat & operator-=(const Quat &q)
Quat operator-()
Quat(Real angle, const geom::Vec3 &axis)
Three dimensional vector class, using Real precision.
Definition vec3.hh:48
#define DLLEXPORT_OST_GEOM
float Real
Definition base.hh:44
Quat DLLEXPORT_OST_GEOM Log(const Quat &q)
Quat DLLEXPORT_OST_GEOM Slerp(const Quat &q0, const Quat &q1, Real t)
Real DLLEXPORT_OST_GEOM Dot(const Quat &q0, const Quat &q1)
Quat DLLEXPORT_OST_GEOM Conjugate(const Quat &q)
Quat DLLEXPORT_OST_GEOM Normalize(const Quat &q)
bool DLLEXPORT_OST_GEOM operator==(const Line2 &l1, const Line2 &l2)
std::ostream & operator<<(std::ostream &os, const AlignedCuboid &c)
Quat DLLEXPORT_OST_GEOM Inv(const Quat &q)
Quat DLLEXPORT_OST_GEOM Exp(const Quat &q)