四元数の演算

四元数内積が欲しかったのでメモ。
四元数qは2つの虚数単位i, j, (k=ij), と4つの実数a, b, c, dを用いて
q=a+ib+jc+kd
と書ける。これを実数部分(スカラー部)と虚部(ベクトル部)に分けて
q=(x,\bf{u})
とも書く。
いま、ふたつの四元数q_1=(x,\bf{u}), q_2=(y,\bf{v})について、積は
q_1*q_2=(xy-\bf{u} \cdot \bf{v},x\bf{v}+y\bf{u}+\bf{u}\times\bf{v})
となる。
 
計算して確かめる。三角形の面積も計算してみる。

set.seed(1234)
xyz <- matrix(runif(6), 3)
q12 <- as.quaternion(rbind(0, xyz))

# xyz での内積
xyz[,1] %*% xyz[,2]

# 四元数での内積
prod(Re(q12)) - Re(q12[1] * q12[2])

# xyz での三角形の面積
sqrt(sum(mapply(function(r) det(cbind(rbind(t(xyz[c(r, r%%3+1),]), 0), 1))^2 ,seq(3))))/2
 
# 四元数での三角形の面積
Mod(Im(q12[1] * q12[2]))/2

 
cpp ではEigenライブラリを使うと爆速だった。簡単な使い方はこちらにまとまっている。