28 #ifndef mrpt_math_slerp_H
29 #define mrpt_math_slerp_H
35 namespace poses {
class CPose3D;
class CPose3DQuat; }
39 using namespace mrpt::poses;
66 double cosHalfTheta = q0[0]*q1[0]+q0[1]*q1[1]+q0[2]*q1[2]+q0[3]*q1[3];
73 bool reverse_q1 =
false;
77 cosHalfTheta = -cosHalfTheta;
80 const double halfTheta = acos(cosHalfTheta);
81 const double sinHalfTheta = std::sqrt(1.0 -
square(cosHalfTheta));
87 for (
int i=0;i<4;i++) q[i] = (1-t)*q0[i] + t*q1[i];
88 else for (
int i=0;i<4;i++) q[i] = (1-t)*q0[i] - t*q1[i];
91 const double A = sin((1-t) * halfTheta)/sinHalfTheta;
92 const double B = sin(t*halfTheta)/sinHalfTheta;
94 for (
int i=0;i<4;i++) q[i] = A*q0[i] + B*q1[i];
95 else for (
int i=0;i<4;i++) q[i] = A*q0[i] - B*q1[i];