とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

wxMaximaでクォータニオンの積を計算する。

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;
    }
}