Menu

[r120]: / trunk / include / small / dquater-function.hpp  Maximize  Restore  History

Download this file

98 lines (84 with data), 3.0 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//=============================================================================
/*! conjuction */
inline dquater conj(const dquater& q)
{
return dquater(-q(0),-q(1),-q(2), q(3));
}
//=============================================================================
/*! imag */
inline dcovec3 imag(const dquater& q)
{
return dcovec3(q(0),q(1),q(2));
}
//=============================================================================
/*! inverse */
inline dquater inv(const dquater& q)
{
return conj(q)/pow(nrm2(q),2);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//=============================================================================
/*! */
inline dquater operator*(const dquater& q1, const dquater& q2)
{
return dquater(q1(3)*q2(0) +q1(0)*q2(3) +q1(1)*q2(2) -q1(2)*q2(1),
q1(3)*q2(1) -q1(0)*q2(2) +q1(1)*q2(3) +q1(2)*q2(0),
q1(3)*q2(2) +q1(0)*q2(1) -q1(1)*q2(0) +q1(2)*q2(3),
q1(3)*q2(3) -q1(0)*q2(0) -q1(1)*q2(1) -q1(2)*q2(2) );
}
//=============================================================================
/*! */
inline dquater operator/(const dquater& q1, const dquater& q2)
{
return q1*inv(q2);
}
//=============================================================================
/*! */
inline dquater operator*=(dquater& q1, const dquater& q2)
{
q1 =q1*q2;
return q1;
}
//=============================================================================
/*! */
inline dquater operator/=(dquater& q1, const dquater& q2)
{
q1 =q1/q2;
return q1;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//=============================================================================
/*! return vector from quaternion (|vector|=theta) */
inline dcovec3 q2vt(const dquater& q)
{
double sin_theta_half;
double theta( 2.*std::acos(q(3)) );
if(theta<M_PI){
sin_theta_half =std::sin(0.5*theta);
}
else{
theta -=2.*M_PI;
sin_theta_half =-std::sin(0.5*theta);
}
return dcovec3( theta*q(0)/sin_theta_half,
theta*q(1)/sin_theta_half,
theta*q(2)/sin_theta_half );
}
//=============================================================================
/*! return rotational matrix made of quaternion */
inline dgemat3 q2m(const dquater& q)
{
dquater cq( conj(q) );
dquater X( dquater(+q(3),+q(2),-q(1),-q(0))*cq );
dquater Y( dquater(-q(2),+q(3),+q(0),-q(1))*cq );
dquater Z( dquater(+q(1),-q(0),+q(3),-q(2))*cq );
dgemat3 mat;
mat(0,0)=X(0); mat(0,1)=Y(0); mat(0,2)=Z(0);
mat(1,0)=X(1); mat(1,1)=Y(1); mat(1,2)=Z(1);
mat(2,0)=X(2); mat(2,1)=Y(2); mat(2,2)=Z(2);
return mat;
}
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.