wxMaxima version
/* quaternion qmul(quaternion l, quaternion r); */ qmul(l,r) := [ l[1]*r[4] + l[4]*r[1] + l[2]*r[3] - l[3]*r[2] , l[2]*r[4] + l[4]*r[2] + l[3]*r[1] - l[1]*r[3] , l[3]*r[4] + l[4]*r[3] + l[1]*r[2] - l[2]*r[1] , l[4]*r[4] - l[1]*r[1] - l[2]*r[2] - l[3]*r[3] ]; q1:[x,y,z,w]; q2:[0,0,0,1]; /* ans = q1 * q2; */ ans:qmul(q1,q2);
C++ version
元になったクォータニオンの積は以下コード。
class Quaternion{ public: float x,y,z,w; inline void Mul(const Quaternion& r) { Quaternion result; result->x = x*r.w + w*r.x + y*r.z - z*r.y; result->y = y*r.w + w*r.y + z*r.x - x*r.z; result->z = z*r.w + w*r.z + x*r.y - y*r.x; result->w = w*r.w - x*r.x - y*r.y - z*r.z; *this = result; } }