四元数与三维向量相乘运算法则
参考网站:
https://www.cnblogs.com/jeason1997/p/9822353.html
四元数和向量相乘可以表示这个向量按照这个四元数进行旋转之后得到的新的向量。
例如:向量 c(0,0,10) 绕着Y轴旋转90°,得到新的向量是 c(10,0,0)。
通常四元ss被记为(w,x,y,z)或(x,y,z,w),以下q表示四元数,v表示向量,那么四元数和向量相乘的运算法则表示为:
q x v = (q) x (v) x (q-1)
例: q = (√2/2 , 0 , √2/2 , 0);
这里需要将三维向量v扩充为四元数(0,v), 如c(0,0,10)变为c(0,0,0,10);
q-1 是四元数q的逆,求逆过程如下:
共轭四元数:q*=(w,-x,-y,-z) 则为 (√2/2 , 0 ,-√2/2 , 0)
四元数的模:N(q) = √(x2 + y2 + z2+ w2 ),通常四元数表示为单位四元数,所以模等于1
四元数的逆: q-1 = q*/N(q) 则为 (√2/2 , 0 ,-√2/2 , 0)
四元数的乘法公式:
按照上述公式可得到新四元数(0,10,0,0),则旋转后新坐标为(10,0,0)
按上述方法计算所得到的新四元数的首项一定等于0。
上述方法 R语言实现:
- 计算共轭四元数
q_star <- function(q){
qstar <- c(q[1],-q[2],-q[3],-q[4])
return(qstar)
}
- 计算四元数模
Nq <- function(q){
N <- sqrt(q[1]^2+q[2]^2+q[3]^2+q[4]^2)
return(N)
}
- 计算四元数的逆
q_reverse <- function(q){
qreverse <- q_star(q)/Nq(q)
return(qreverse)
}
- 叉乘公式
q_multiply <- function(a,b){
w1 <- a[1]
x1 <- a[2]
y1 <- a[3]
z1 <- a[4]
w2 <- b[1]
x2 <- b[2]
y2 <- b[3]
z2 <- b[4]
amulb <- c((w1*w2-x1*x2-y1*y2-z1*z2),(w1*x2+x1*w2+y1*z2-z1*y2),
(w1*y2+y1*w2+z1*x2-x1*z2),(w1*z2+z1*w2+x1*y2-y1*x2))
return(amulb)
}
- 四元数与三维向量相乘
mul <- function(q,v){
a <- q_multiply(q,v)
b <- q_multiply(a, q_reverse(q))
return(b)
}