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

写一个3D旋转的python程序

今天要用到的是科学计算数据包SciPy,简单介绍一下。

Scipy是一个Python科学计算库,它提供了许多常用的科学计算功能,如数值积分、最优化、信号处理、线性代数、统计分析、图像处理、傅里叶变换等。Scipy是在Numpy的基础上构建的,因此它可以与Numpy一起使用,以便更高效地进行科学计算。

Scipy中的一些常用模块包括:

  • scipy.integrate:提供了数值积分函数,如quad、dblquad和nquad等。
  • scipy.optimize:提供了各种优化算法,如最小二乘法、非线性方程求解、曲线拟合等。
  • scipy.signal:提供了信号处理相关的函数,如傅里叶变换、滤波器设计、相关性分析等。
  • scipy.linalg:提供了线性代数相关的函数,如矩阵分解、特征值求解等。
  • scipy.stats:提供了统计分析相关的函数,如概率密度函数、假设检验等。

这里要引用的模块是pip install numpy scipy pyqt5 tkinter matplotlib

源代码:

import numpy as np
from scipy.spatial.transform import Rotation as R
import tkinter as tk
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 创建GUI界面
root = tk.Tk()
root.title("3D Rotation")
root.geometry("500x500")# 创建一个3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 创建一个立方体
vertices = np.array([[-1, -1, -1],[-1, -1,  1],[-1,  1, -1],[-1,  1,  1],[ 1, -1, -1],[ 1, -1,  1],[ 1,  1, -1],[ 1,  1,  1]])faces = np.array([[0, 1, 3, 2],[0, 4, 5, 1],[0, 2, 6, 4],[7, 5, 4, 6],[7, 6, 2, 3],[7, 3, 1, 5]])# 绘制立方体并显示
ax.scatter(vertices[:,0], vertices[:,1], vertices[:,2])
for face in faces:ax.plot(vertices[face,0], vertices[face,1], vertices[face,2], 'k-')ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_zlim(-2,2)canvas = plt.gcf().canvas
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)# 创建旋转函数
def rotate():angle_x = float(entry_x.get())angle_y = float(entry_y.get())angle_z = float(entry_z.get())r = R.from_euler('xyz', [angle_x, angle_y, angle_z], degrees=True)rotated_vertices = r.apply(vertices)# 更新立方体的顶点坐标并重新绘制ax.collections.clear()ax.scatter(rotated_vertices[:,0], rotated_vertices[:,1], rotated_vertices[:,2])for face in faces:ax.plot(rotated_vertices[face,0], rotated_vertices[face,1], rotated_vertices[face,2], 'k-')canvas.draw()# 添加旋转角度输入框和按钮
frame = tk.Frame(root)
frame.pack()label_x = tk.Label(frame, text="X轴旋转角度")
label_x.pack(side=tk.LEFT)entry_x = tk.Entry(frame)
entry_x.pack(side=tk.LEFT)label_y = tk.Label(frame, text="Y轴旋转角度")
label_y.pack(side=tk.LEFT)entry_y = tk.Entry(frame)
entry_y.pack(side=tk.LEFT)label_z = tk.Label(frame, text="Z轴旋转角度")
label_z.pack(side=tk.LEFT)entry_z = tk.Entry(frame)
entry_z.pack(side=tk.LEFT)button_rotate = tk.Button(root, text="旋转", command=rotate)
button_rotate.pack()root.mainloop()

这里运行测试时可能会出现,this application failed to start because no qt platform plugin报错,原因是环境变量里未添加路径。按照如下步骤,在everything输入plugins\platforms,查找到Qt对应项目的路径,复制路径地址。

img

搜索栏搜索-查看高级系统设置,添加环境变量,变量名:QT_QPA_PLATFORM_PLUGIN_PATH

变量值:C:\Users\YOUR_NAME\PycharmProjects\pythonProject1\plugins\platforms。类似这样的地址别直接复制哈

img

重启pycharm就正常了。

再运行测试一下:

img
它是可以通过鼠标拖拽进行3D旋转的,感兴趣的同学可以试一下。

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

相关文章:

  • 字节跳动开源Coze,开启AI Agent开发新时代?
  • 【Linux篇章】穿越数据迷雾:HTTPS构筑网络安全的量子级护盾,重塑数字信任帝国!
  • 新能源行业B端极简设计:碳中和目标下的交互轻量化实践
  • 【数据架构09】人工智能及数据智能架构篇
  • 群晖Synology Drive:打造高效安全的私有云协作平台
  • 优测推出HarmonyOS全场景测试服务,解锁分布式场景应用卓越品质!
  • httpx 接口测试教程
  • HarmonyOS 6 云开发-用户头像上传云存储
  • 打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
  • UniappDay04
  • Java 排序
  • Kafka——请求是怎么被处理的?
  • flutter使用firebase集成谷歌,苹果登录
  • Claude Launcher:支持Kimi K2的Claude Code可视化启动工具
  • 力扣988. 从叶结点开始的最小字符串
  • 负载均衡集群HAproxy
  • keepalived
  • Redis做混沌测试都需要测哪些场景?预期如何?
  • 安宝特案例丨AR+AI赋能轨道交通制造:破解人工装配难题的创新实践
  • [免费]【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts)【论文+源码+SQL脚本】
  • 【代码解读】通义万相最新视频生成模型 Wan 2.2 实现解析
  • ESP32学习-按键中断
  • 【重学数据结构】二叉搜索树 Binary Search Tree
  • 源代码管理工具有哪些?有哪些管理场景?
  • [VLDB 2025]面向Flink集群巡检的交叉对比学习异常检测
  • mybatis-plus实体类主键生成策略
  • 设计模式(四)创建型:生成器模式详解
  • Java排序中(a).compareTo(b)与Integer.compare(a, b)区别
  • 推荐系统学习
  • 算法竞赛阶段二-数据结构(37)数据结构循环链表模拟实现