/// <summary> /// x × y。 /// </summary> /// <param name="x">x</param> /// <param name="y">y</param> /// <returns>x × y</returns> public static Quaternion operator*(Quaternion x, Quaternion y) { double a = x.a * y.a - Vector.InnerProduct(x.u, y.u); Vector u = x.a * y.u + y.a * x.u + Vector.OuterProduct(x.u, y.u); return(new Quaternion(a, u)); }
/// <summary> /// 四元数を使って3次元空間上の回転。 /// p × (0, x) × ~p を計算する(~p は p の共役)。 /// </summary> /// <param name="p">回転軸/角を表す四元数</param> /// <param name="x">回転させたい点のベクトル</param> /// <returns>回転後の点のベクトル</returns> public static Vector Rotate(Quaternion p, Vector x) { Vector y = (p.a * p.a - p.u.Norm) * x; y += 2 * (Vector.InnerProduct(p.u, x) * p.u + p.a * Vector.OuterProduct(p.u, x)); return(y); }