python程序19:写一个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对应项目的路径,复制路径地址。

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

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

重启pycharm就正常了。

再运行测试一下:

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

发表评论

zh_CNChinese