/****************************************** * C++ Spherical Splines * Version: 1.0.9 * Author: Douglas Wilhelm Harder * Date: 2008/03/03 * * Copyright (c) 2007-8 by Douglas Wilhelm Harder. * All rights reserved. * * References: * Ken Shoemake, 'Animating Rotation with Quatenrion Curves', SIGGRAPH 95. * Erik B. Dam, Martin Koch, Martin Lillholm, * 'Quaternions, Interpolation and Animation', Technical Report DIKU-TR-98/5. ******************************************/ #include "Spline.h" #include "Complex.h" #include "Quaternion.h" #include "Octonion.h" #include "Sedenion.h" #include "Trigintaduonion.h" template Spline::Spline( T * q, unsigned int N ):n(N), slerpq( new Slerp[n - 1] ), slerpa( new Slerp[n - 1] ) { T * a = new T[n]; q0 = q[0]; qn = q[n - 1]; a[0] = q[0]; for ( unsigned int i = 1; i < n - 1; ++i ) { T invqi = inverse(q[i]); a[i] = q[i] * exp( -static_cast(0.25)*( log(invqi*q[i + 1]) + log(invqi*q[i - 1]) ) ); } a[n - 1] = q[n - 1]; for ( unsigned int i = 0; i < n - 1; ++i ) { slerpq[i] = Slerp( q[i], q[i + 1] ); slerpa[i] = Slerp( a[i], a[i + 1] ); } delete [] a; } template Spline::~Spline() { delete [] slerpq; delete [] slerpa; } template T Spline::value( S t ) const { if ( t <= 0 ) { return q0; } if ( t >= n - 1 ) { return qn; } int m = static_cast( std::floor( t ) ); S ft = t - static_cast( m ); return Slerp( slerpq[m].value(ft), slerpa[m].value(ft) ).value( 2*ft*(1 - ft) ); } template class Spline< Quaternion, long double >; template class Spline< Quaternion, double >; template class Spline< Quaternion, float >; template class Spline< Octonion, long double >; template class Spline< Octonion, double >; template class Spline< Octonion, float >; template class Spline< Sedenion, long double >; template class Spline< Sedenion, double >; template class Spline< Sedenion, float >; template class Spline< Trigintaduonion, long double >; template class Spline< Trigintaduonion, double >; template class Spline< Trigintaduonion, float >;