四元数与三维向量相乘运算法则

四元数与三维向量相乘运算法则

参考网站:
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语言实现:

  1. 计算共轭四元数
q_star <- function(q){
  qstar <- c(q[1],-q[2],-q[3],-q[4])
  return(qstar)
}
  1. 计算四元数模
Nq <- function(q){
  N <- sqrt(q[1]^2+q[2]^2+q[3]^2+q[4]^2)
  return(N)
}
  1. 计算四元数的逆
q_reverse <- function(q){
  qreverse <- q_star(q)/Nq(q)
  return(qreverse)
}
  1. 叉乘公式
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)
}
  1. 四元数与三维向量相乘
mul <- function(q,v){
  a <- q_multiply(q,v)
  b <- q_multiply(a, q_reverse(q))
  return(b)
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值