如果坐标(x,y,z)->(y,-z,-x)可以使用坐标系:
import math def mat_vec_mult(matrix, vector): """ 将 3x3 矩阵与 3x1 向量相乘。 参数: matrix: 3x3 的旋转矩阵 vector: 3x1 的向量 返回: 3x1 的结果向量 """ result = [0, 0, 0] for i in range(3): result[i] = sum(matrix[i][j] * vector[j] for j in range(3)) return result def rotation_matrix_intrinsic_xyz(alpha, beta, gamma, degrees=True): """ 计算内旋顺序(绕 x、y、z 轴)下的旋转矩阵。 参数: alpha: 绕 x 轴的旋转角度 beta: 绕 y 轴的旋转角度 gamma: 绕 z 轴的旋转角度 degrees: 如果为 True,则输入角度为度;否则为弧度 返回: 3x3 的旋转矩阵,作为嵌套列表 """ if degrees: alpha = math.radians(alpha) beta = math.radians(beta) gamma = math.radians(gamma) # 绕 x 轴的旋转矩阵 Rx = [ [1, 0, 0], [0, math.cos(alpha), -math.sin(alpha)], [0, math.sin(alpha), math.cos(alpha)] ] # 绕 y 轴的旋转矩阵 Ry = [ [ math.cos(beta), 0, math.sin(beta)], [0, 1, 0], [-math.sin(beta), 0, math.cos(beta)] ] # 绕 z 轴的旋转矩阵 Rz = [ [math.cos(gamma), -math.sin(gamma), 0], [math.sin(gamma), math.cos(gamma), 0], [0, 0, 1] ] # 矩阵乘法:R = Rx * Ry * Rz def mat_mult(A, B): result = [[0]*3 for _ in range(3)] for i in range(3): for j in range(3): result[i][j] = sum(A[i][k] * B[k][j] for k in range(3)) return result # R = mat_mult(Rx, mat_mult(Ry, Rz)) R=mat_mult(Rz, mat_mult(Ry, Rx)) return R # 示例:绕 x 轴旋转 30 度,绕 y 轴旋转 45 度,绕 z 轴旋转 60 度# alpha = -90 # 绕 x 轴的角度# beta = 180 # 绕 y 轴的角度# gamma = 45 # 绕 z 轴的角度 alpha = -90 # 绕 x 轴的角度beta = 0 # 绕 y 轴的角度gamma = 90 # 绕 z 轴的角度 rotation_matrix = rotation_matrix_intrinsic_xyz(alpha, beta, gamma) print("旋转矩阵:")for row in rotation_matrix: print(row) a=[0,0,1]# 应用旋转矩阵+b = mat_vec_mult(rotation_matrix, a) print("旋转矩阵:",b)
这里,用内旋方法(每次都绕自己变化的轴转),R=Rz*Ry*Rx先绕x轴转,再绕y轴转,最后绕z轴转,可得到结果。
也可以用外旋的方法,绕x轴转,再绕y轴转,最后绕z轴转R=Rx*Ry*Rz,绕原来的坐标轴:
import math def mat_vec_mult(matrix, vector): """ 将 3x3 矩阵与 3x1 向量相乘。 参数: matrix: 3x3 的旋转矩阵 vector: 3x1 的向量 返回: 3x1 的结果向量 """ result = [0, 0, 0] for i in range(3): result[i] = sum(matrix[i][j] * vector[j] for j in range(3)) return result def rotation_matrix_intrinsic_xyz(alpha, beta, gamma, degrees=True): """ 计算内旋顺序(绕 x、y、z 轴)下的旋转矩阵。 参数: alpha: 绕 x 轴的旋转角度 beta: 绕 y 轴的旋转角度 gamma: 绕 z 轴的旋转角度 degrees: 如果为 True,则输入角度为度;否则为弧度 返回: 3x3 的旋转矩阵,作为嵌套列表 """ if degrees: alpha = math.radians(alpha) beta = math.radians(beta) gamma = math.radians(gamma) # 绕 x 轴的旋转矩阵 Rx = [ [1, 0, 0], [0, math.cos(alpha), -math.sin(alpha)], [0, math.sin(alpha), math.cos(alpha)] ] # 绕 y 轴的旋转矩阵 Ry = [ [ math.cos(beta), 0, math.sin(beta)], [0, 1, 0], [-math.sin(beta), 0, math.cos(beta)] ] # 绕 z 轴的旋转矩阵 Rz = [ [math.cos(gamma), -math.sin(gamma), 0], [math.sin(gamma), math.cos(gamma), 0], [0, 0, 1] ] # 矩阵乘法:R = Rx * Ry * Rz def mat_mult(A, B): result = [[0]*3 for _ in range(3)] for i in range(3): for j in range(3): result[i][j] = sum(A[i][k] * B[k][j] for k in range(3)) return result R = mat_mult(Rx, mat_mult(Ry, Rz)) #外旋 # R=mat_mult(Rz, mat_mult(Ry, Rx)) #内旋 return R # 示例:绕 x 轴旋转 30 度,绕 y 轴旋转 45 度,绕 z 轴旋转 60 度# alpha = -90 # 绕 x 轴的角度# beta = 180 # 绕 y 轴的角度# gamma = 45 # 绕 z 轴的角度 alpha = -90 # 绕 x 轴的角度beta = -90 # 绕 y 轴的角度gamma = 0 # 绕 z 轴的角度 rotation_matrix = rotation_matrix_intrinsic_xyz(alpha, beta, gamma) print("旋转矩阵:")for row in rotation_matrix: print(row) a=[1,0,0]# 应用旋转矩阵+b = mat_vec_mult(rotation_matrix, a) print("旋转矩阵:",b)