向量旋转公式推导

 

所以我们得到了函数Rotate

Vector Rotate(Vector A,double rad) 
{
    return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}

转载于:https://www.cnblogs.com/Ritchie/p/5664717.html

### Rodrigues 旋转公式推导过程 Rodrigues 旋转公式是一种用于描述三维空间中向量绕某一固定轴旋转的方法。其核心在于通过几何分解和代数运算,将复杂的旋转操作简化为易于处理的形式。 #### 几何背景 假设有一个三维向量 $\mathbf{v}$ 和一个单位化的旋转轴 $\mathbf{k}$,$\mathbf{v}$ 绕着 $\mathbf{k}$ 轴逆时针方向旋转角度 $\theta$ 后得到新的向量 $\mathbf{v}'$。为了实现这一目标,可以将原向量 $\mathbf{v}$ 分解成两个分量:平行于旋转轴的部分 $\mathbf{v}_{\parallel}$ 和垂直于旋转轴的部分 $\mathbf{v}_{\perp}$[^1]。 $$ \mathbf{v} = \mathbf{v}_{\parallel} + \mathbf{v}_{\perp} $$ 其中, $$ \mathbf{v}_{\parallel} = (\mathbf{v} \cdot \mathbf{k}) \mathbf{k}, \quad \mathbf{v}_{\perp} = \mathbf{v} - \mathbf{v}_{\parallel}. $$ 由于 $\mathbf{v}_{\parallel}$ 平行于旋转轴,在旋转过程中保持不变;而 $\mathbf{v}_{\perp}$ 则会围绕旋转轴发生平面内的圆周运动[^2]。 #### 数学表达式 经过上述分析可知,新向量 $\mathbf{v}'$ 可表示为: $$ \mathbf{v}' = \mathbf{v}_{\parallel} + R(\mathbf{v}_{\perp}), $$ 其中 $R(\mathbf{v}_{\perp})$ 表示垂直部分在旋转后的结果。进一步利用三角函数关系以及叉乘性质可得: $$ R(\mathbf{v}_{\perp}) = \cos{\theta}\, \mathbf{v}_{\perp} + \sin{\theta}\, (\mathbf{k} \times \mathbf{v}_{\perp}). $$ 注意到 $(\mathbf{k} \times \mathbf{v}_{\perp})$ 是由 $\mathbf{k}$ 和 $\mathbf{v}_{\perp}$ 构成的一个正交基矢量,因此上式实际上是在该平面上实现了标准二维旋转变换[^3]。 最终综合各项贡献得出完整的 Rodrigues 公式如下所示: $$ \mathbf{v}' = \mathbf{v} \cos{\theta} + (\mathbf{k} \times \mathbf{v}) \sin{\theta} + \mathbf{k} (\mathbf{k} \cdot \mathbf{v})(1-\cos{\theta}) $$ 此即为经典的 Rodrigues 旋转公式。 #### 矩阵形式转换 如果希望把上述公式写成矩阵形式,则可以通过定义所谓的 **叉积矩阵** 来完成转化。设任意三维列向量 $\mathbf{x}=[x_1,x_2,x_3]^T$ 的对应叉积矩阵记作 $[\mathbf{x}]_{\times}$ ,则有: ```python def cross_product_matrix(x): return np.array([[0, -x[2], x[1]], [x[2], 0, -x[0]], [-x[1], x[0], 0]]) ``` 那么对于任意向量 $\mathbf{a},\mathbf{b}$ 都满足关系 $ [\mathbf{a}]_\times \mathbf{b}= \mathbf{a} \times \mathbf{b} $. 借助这个工具我们可以重新整理前面提到的标准 Rodrigues 方程式成为紧凑的矩阵版本. 具体而言,令输入参数分别为单位长度的方向向量 k (作为转轴), 待旋转向量 v ,还有指定的角度 theta . 输出则是经相应转动之后的结果 w : ```python import numpy as np def rodrigues_rotation(k, v, theta): K = cross_product_matrix(k) I = np.eye(3) # Identity matrix of size 3 term1 = np.cos(theta)*I term2 = np.sin(theta)*K term3 = (1-np.cos(theta))*(np.outer(k,k)) rotation_matrix = term1 + term2 + term3 result_vector = np.dot(rotation_matrix,v) return result_vector ``` 以上便是基于 Rodrigues 定理构建起来的一套完整算法框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值