用tkinter建立一个一级直线倒立摆环境代码
时间: 2024-05-04 09:17:22 浏览: 7
好的,以下是一个使用Tkinter构建的一级直线倒立摆环境的示例代码:
```python
import tkinter as tk
class InvertedPendulum(tk.Canvas):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
# 设置画布大小
self.width = 400
self.height = 400
self.configure(width=self.width, height=self.height)
# 绘制底座
self.create_rectangle(self.width/2-20, self.height/2-10, self.width/2+20, self.height/2+10, fill='black')
# 绘制杆子和小球
self.pole = self.create_line(self.width/2, self.height/2, self.width/2, self.height/2-100, width=2)
self.ball = self.create_oval(self.width/2-20, self.height/2-120, self.width/2+20, self.height/2-80, fill='red')
# 初始化参数
self.angle = 0
self.angle_vel = 0
self.dt = 0.1
self.length = 100
self.gravity = 9.8
self.mass = 1
self.damping = 0.1
self.after(10, self.update)
def update(self):
# 计算杆子的角加速度
numerator = -self.gravity * self.mass * self.length * tk.sin(self.angle)
denominator = self.mass * self.length ** 2
self.angle_vel += (numerator / denominator - self.damping * self.angle_vel) * self.dt
self.angle += self.angle_vel * self.dt
# 更新杆子和小球的位置
x = self.width/2 + self.length * tk.sin(self.angle)
y = self.height/2 - self.length * tk.cos(self.angle)
self.coords(self.pole, self.width/2, self.height/2, x, y)
self.coords(self.ball, x-20, y-20, x+20, y+20)
# 继续更新
self.after(10, self.update)
if __name__ == '__main__':
root = tk.Tk()
root.title('Inverted Pendulum')
pendulum = InvertedPendulum(root)
pendulum.pack()
root.mainloop()
```
这个环境中只有一个杆子和一个小球,杆子是在底座上方垂直向上的,小球位于杆子的顶端。杆子的角度随时间变化,小球也会随之上下运动。你可以自己修改代码中的参数来改变杆子和小球的运动。