OpenLexocad  27.1
DualQuaternion.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) 2019 Viktor Titov (DeepSOIC) <vv.titov@gmail.com> *
3  * *
4  * This file is part of the FreeCAD CAx development system. *
5  * *
6  * This library is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Library General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU Library General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Library General Public *
17  * License along with this library; see the file COPYING.LIB. If not, *
18  * write to the Free Software Foundation, Inc., 59 Temple Place, *
19  * Suite 330, Boston, MA 02111-1307, USA *
20  * *
21  ***************************************************************************/
22 
23 #ifndef FREECAD_BASE_DUAL_QUATERNION_H
24 #define FREECAD_BASE_DUAL_QUATERNION_H
25 
26 #include "DualNumber.h"
27 //#include <Console.h> //DEBUG
28 
29 namespace Base {
30 
42 class LX_BASE_EXPORT DualQuat {
43 public:
48 public:
52  : x(x), y(y), z(z), w(w) {}
53  DualQuat(double x,double y,double z,double w,double dx,double dy,double dz,double dw)
54  : x(x, dx), y(y, dy), z(z, dz), w(w, dw) {}
55  DualQuat(double x,double y,double z,double w)
56  : x(x), y(y), z(z), w(w) {}
57 
59  DualQuat(DualQuat re, DualQuat du);
60 
62  static DualQuat identity() {return DualQuat(0.0, 0.0, 0.0, 1.0);}
63 
65  DualQuat real() const {return DualQuat(x.re, y.re, z.re, w.re);}
66 
68  DualQuat dual() const {return DualQuat(x.du, y.du, z.du, w.du);}
69 
71  DualQuat conj() const {return DualQuat(-x, -y, -z, w);}
72 
74  DualQuat vec() const {return DualQuat(x,y,z,0.0);}
75 
77  double length() const {return sqrt(x.re*x.re + y.re*y.re + z.re*z.re + w.re*w.re);}
78 
80  double theta() const {return 2.0 * atan2(vec().length(), w.re);}
81 
83  static double dot(DualQuat a, DualQuat b);
84 
86  DualQuat pow(double t, bool shorten = true) const;
87 
88  DualQuat operator-() const {return DualQuat(-x, -y, -z, -w);}
89 
90  //DEBUG
91  //void print() const {
92  // Console().Log("%f, %f, %f, %f; %f, %f, %f, %f", x.re,y.re,z.re,w.re, x.du,y.du,z.du, w.du);
93  //}
94 };
95 
96 DualQuat operator+(DualQuat a, DualQuat b);
97 DualQuat operator-(DualQuat a, DualQuat b);
98 DualQuat operator*(DualQuat a, DualQuat b);
99 
100 DualQuat operator*(DualQuat a, double b);
101 DualQuat operator*(double a, DualQuat b);
102 DualQuat operator*(DualQuat a, DualNumber b);
103 DualQuat operator*(DualNumber a, DualQuat b);
104 
105 
106 } //namespace
107 
108 #endif
DualQuat dual() const
return a real-only quaternion made from dual part of this quaternion.
Definition: DualQuaternion.h:68
double du
Definition: DualNumber.h:42
DualNumber z
Definition: DualQuaternion.h:46
DualQuat real() const
return a copy with dual part zeroed out
Definition: DualQuaternion.h:65
DualQuat(DualNumber x, DualNumber y, DualNumber z, DualNumber w)
Definition: DualQuaternion.h:51
DualNumber operator-(DualNumber a, DualNumber b)
Definition: DualNumber.h:61
double theta() const
angle of rotation represented by this quaternion, in radians
Definition: DualQuaternion.h:80
DualQuat(double x, double y, double z, double w, double dx, double dy, double dz, double dw)
Definition: DualQuaternion.h:53
DualQuat(double x, double y, double z, double w)
Definition: DualQuaternion.h:55
static DualQuat identity()
returns dual quaternion for identity placement
Definition: DualQuaternion.h:62
Dual Numbers aer 2-part numbers like complex numbers, but different algebra. They are denoted as a + ...
Definition: DualNumber.h:38
double re
Definition: DualNumber.h:41
DualNumber w
Definition: DualQuaternion.h:47
DualQuat vec() const
return vector part (with scalar part zeroed out)
Definition: DualQuaternion.h:74
DualNumber x
Definition: DualQuaternion.h:44
The DualQuat class represents a dual quaternion, as a quaternion of dual number components....
Definition: DualQuaternion.h:42
DualNumber operator+(DualNumber a, DualNumber b)
Definition: DualNumber.h:51
DualQuat operator-() const
Definition: DualQuaternion.h:88
Definition: AbstractXMLReader.h:5
DualQuat conj() const
conjugate
Definition: DualQuaternion.h:71
DualQuat()
default constructor: init with zeros
Definition: DualQuaternion.h:50
double length() const
magnitude of the quaternion
Definition: DualQuaternion.h:77
DualNumber operator *(DualNumber a, DualNumber b)
Definition: DualNumber.h:71
DualNumber pow(DualNumber a, double pw)
Definition: DualNumber.h:88
DualNumber y
Definition: DualQuaternion.h:45