/// <summary> /// 四元数を使って3次元空間上の回転。 /// p × x × ~q を計算する(~p は p の共役)。 /// </summary> /// <param name="p">p</param> /// <param name="x">x</param> /// <returns>p × x × ~q</returns> public static Quaternion Rotate(Quaternion p, Quaternion x) { return new Quaternion(x.a, Rotate(p, x.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; }