如何对N维numpy向量绕N维单位向量v旋转theta弧度?
N维向量绕单位向量旋转的实现方法
核心原理
在N维空间中绕单位向量v旋转θ弧度,本质是保持v方向的分量不变,仅在垂直于v的N-1维子空间内对向量的垂直分量进行平面旋转。该方法是3D空间罗德里格斯旋转公式的高维推广,通过正交基构造+块对角旋转矩阵实现。
实现步骤(Numpy代码)
import numpy as np def rotate_n_vector(x, v, theta): # 确保旋转轴v是单位向量 v = v / np.linalg.norm(v) # 分解向量x为平行于v的分量和垂直分量 proj_v_x = np.dot(x, v) * v perp_x = x - proj_v_x perp_norm = np.linalg.norm(perp_x) # 若x与v共线,旋转后向量不变 if perp_norm < 1e-10: return x.copy() # 用Gram-Schmidt构造包含v的正交基 # 前两个基向量:v,以及垂直分量的单位向量 u = perp_x / perp_norm ortho_basis = np.column_stack([v, u]) # 补充剩余的正交基向量 dim = len(v) for i in range(2, dim): # 取标准基向量,投影到已有基的正交补空间 e = np.zeros(dim) e[i] = 1 for col in ortho_basis.T: e -= np.dot(e, col) * col # 单位化后加入基矩阵 e_norm = np.linalg.norm(e) if e_norm > 1e-10: e = e / e_norm ortho_basis = np.column_stack([ortho_basis, e]) # 构造块对角旋转矩阵:v方向分量不变,垂直子空间内做平面旋转 rot_matrix = np.eye(dim) # 2D旋转矩阵块(对应垂直子空间的前两个基向量平面) rot_matrix[1, 1] = np.cos(theta) rot_matrix[1, 2] = -np.sin(theta) rot_matrix[2, 1] = np.sin(theta) rot_matrix[2, 2] = np.cos(theta) # 通过正交基的变换实现旋转 x_rotated = ortho_basis @ rot_matrix @ ortho_basis.T @ x return x_rotated
关键说明
- 分量分解:任何N维向量都可拆分为平行于旋转轴
v的分量(旋转后不变)和垂直分量(仅这部分参与旋转)。 - 正交基构造:通过Gram-Schmidt方法生成包含
v的正交基,确保旋转矩阵的变换在正确的子空间内进行。 - 旋转矩阵设计:块对角矩阵保证
v方向分量不受影响,仅在垂直子空间的一个平面内执行θ角度旋转,与3D空间绕轴旋转逻辑一致。 - 边界处理:当向量与旋转轴共线时,直接返回原向量,避免计算误差。
内容的提问来源于stack exchange,提问作者fakedrake
相关产品推荐
相关产品推荐

