当前位置: 首页 > news >正文

三维坐标转换

如果坐标(x,y,z)->(y,-z,-x)可以使用坐标系:

import mathdef 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 resultdef 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 * Rzdef 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 mathdef 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 resultdef 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 * Rzdef 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 resultR = 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)

http://www.xdnf.cn/news/876259.html

相关文章:

  • AXPM11584:颠覆传统,发现新可能
  • 灰狼优化算法MATLAB实现,包含种群初始化和29种基准函数测试
  • Mask篇 (含引导层、不规则遮罩)
  • 深入解析Java17核心新特性(密封类、模式匹配增强、文本块)
  • Python 类型注释 - typing
  • 关于Dify聊天对话名称无法自动生成的原因和解决方法
  • ReviewHub:实现Booster与设计工具端无缝链接的评审协作平台
  • Seata 分布式事务安装配置集成实战
  • Git忽略规则.gitignore不生效解决
  • 突破模型成本瓶颈:MoE如何让专业大模型更易用?​
  • echarts使用graph、lines实现拓扑,可以拖动增加effect效果
  • 力扣HOT100之二分查找:35. 搜索插入位置
  • PH热榜 | 2025-06-04
  • Facebook接入说明
  • JavaScript 二维数组初始化:为什么 fill([]) 是个大坑?
  • 群论在现代密码学中的应用探索与实践 —— 从理论到C语言实现
  • 列出浏览器所有的启动参数,并解释说明每个参数的含义
  • 行为型-模板模式
  • 【高校论文】DFORMER重新思考用于语义分割的RGBD表示学习[南开国防科大]
  • 电路图识图基础知识-直接启动/接触器启动(十四)
  • 分布式训练下的多进程环境
  • [Java 基础]枚举
  • NLP中的input_ids是什么?
  • Pycharm 配置解释器
  • mybatis实现插入postgresql的json类型数据
  • DA14531_beacon_大小信标设备开发
  • 如何安装并使用RustDesk
  • Java Fork/Join框架:三大核心组件深度解析
  • 功率估计和功率降低方法指南(1~2)
  • 2025年6月4日收获