[python][vpython]用vpython实现小球砸弹簧代码

news/2025/1/7 15:00:24/

代码:

from vpython import *  # 加载vpython模块s1 = canvas(width=1200, height=500, background=color.white, center=vector(0, 1, 0))  # 定义画布
L0 = 1.4  # 定义初始高度
natural_length = 0.9  # 设置弹簧原长
base_spring = box(pos=vector(0, 0, 0), size=vector(0.1, 0.02, 0.1), color=color.white)  # 创建基座
ball1 = sphere(pos=vector(0, L0, 0), radius=0.05, color=color.blue)  # 创建小球
spring = helix(pos=vector(0, 0, 0), axis=vector(0, 1, 0), radius=0.03, coils=13, length=natural_length, thickness=0.01,color=color.yellow)  # 创建弹簧
s1.autoscale = 0  # 禁止画面自动缩放
g1 = graph(width=400, height=300, xtitle="时间/s", ytitle="能量/J", align="left")  # 定义曲线显示窗口
EKcurve = gcurve(color=color.red, graph=g1, label="动能")  # 定义动能曲线
EPEcurve = gcurve(color=color.blue, graph=g1, label="弹性势能")  # 定义弹性势能曲线
EPHcurve = gcurve(color=color.green, graph=g1, label="重力势能")  # 定义弹性势能曲线
EEcurve = gcurve(color=color.yellow, graph=g1, label="小球机械能")  # 定义小球机械能曲线
Ecurve = gcurve(color=color.black, graph=g1, label="系统机械能")  # 定义系统机械能曲线g2 = graph(width=400, height=300, xtitle="时间/s", ytitle="速度/m/s", align="left")  # 定义曲线显示窗口
Vcurve = gcurve(color=color.red, graph=g2, label="速度")  # 定义动能曲线g3 = graph(width=400, height=300, xtitle="时间/s", ytitle="加速度/m/s^2", align="left")  # 定义曲线显示窗口
Acurve = gcurve(color=color.magenta, graph=g3, label="加速度")  # 定义动能曲线
vector_f = arrow(color=color.black, shaftwidth=0.01)  # 定义弹簧弹力矢量箭头
f_label = label(text="T", height=20, opacity=0, box=False)  # 定义弹簧弹力标签
vector_g = arrow(color=color.red, shaftwidth=0.01)  # 定义重力矢量箭头
g_label = label(text='G', height=20, opacity=0, box=False)  # 定义重力标签EK_label = label(text="动能", height=20, opacity=0, box=False)  # 定义小球动能标签
EPE_label = label(text="弹性势能", height=20, opacity=0, box=False)  # 定义弹性势能标签
EPH_label = label(text="重力势能", height=20, opacity=0, box=False)  # 定义弹性势能标签
vector_scale = 0.1  # 设置箭头缩放系数m = 0.2  # 设定小球质量
k = 10  # 设置弹簧劲度系数
g = -10  # 设置重力加速度
ball1.v = vector(0, 0, 0)  # 设定小球初始速度矢量
ball1.a = vector(0, 0, 0)  # 设定小球初始加速度矢量
t = 0  # 设定时间变量
dt = 0.0001  # 设置时间间隔
EPE = 0  # 设定重力势能
G = m * g  # 设定重力while t < 5:  # 设置循环总时间rate(1000)  # 设置每秒循环次数if (ball1.pos.y > natural_length):ball1.a.y = g  # 自由落体加速度ball1.v = ball1.v + ball1.a * dt  # 计算小球速度矢量更新值ball1.pos = ball1.pos + ball1.v * dt  # 计算小球位置矢量更新值else:spring.length = ball1.pos.y  # 计算新的弹簧长度delta_length = spring.length - natural_length  # 计算弹簧变形长度f = -k * delta_length  # 计算弹簧弹力ball1.a.y = (f + G) / m  # 根据牛顿第二定律计算小球加速度ball1.v = ball1.v + ball1.a * dt  # 计算小球速度矢量更新值ball1.pos = ball1.pos + ball1.v * dt  # 计算小球位置矢量更新值EPE = 0.5 * k * delta_length ** 2  # 计算弹簧弹性势能vector_f.pos = ball1.pos  # 更新弹力箭头位置vector_f.axis = vector(0, f, 0) * vector_scale  # 更新弹力箭头大小if (f > -G):  # 更新弹力箭头颜色vector_f.color = color.orangeelse:vector_f.color = color.purplef_label.pos = vector_f.pos + vector_f.axis * 1.2  # 设置弹力标签位置f_label.pos.x = f_label.pos.x - 0.1f_label.text = "f=" + str(f)[:4]  # 设置弹力标签显示内容EK = 0.5 * m * (mag(ball1.v)) ** 2  # 计算小球动能EPH = m * g * (L0 - ball1.pos.y)E = EK + EPE + EPH  # 计算系统机械能EE = EK + EPH  # 计算小球机械能vector_g.pos = ball1.pos  # 更新弹力箭头位置vector_g.axis = vector(0, G, 0) * vector_scale  # 更新弹力箭头大小g_label.pos = vector_g.pos + vector_g.axis * 1.2  # 设置弹力标签位置g_label.pos.x = g_label.pos.x - 0.1g_label.text = "G=" + str(G)[:4]  # 设置弹力标签显示内容EK_label.pos = vector(ball1.pos.x + 0.5, ball1.pos.y, ball1.pos.z)  # 设置动能标签位置EK_label.text = "动    能=" + str("%.2f" % EK)  # 设置动能标签显示内容EPE_label.pos = vector(EK_label.pos.x + 0.0, EK_label.pos.y - 0.2, EK_label.pos.z)  # 设置弹性势能标签位置EPE_label.text = "弹性势能=" + str("%.2f" % EPE)  # 设置弹性势能标签显示内容EPH_label.pos = vector(ball1.pos.x + 0.5, ball1.pos.y - 0.1, ball1.pos.z)  # 设置弹性势能标签位置EPH_label.text = "重力势能=" + str("%.2f" % EPH)  # 设置弹性势能标签显示内容EKcurve.plot(t, EK)  # 绘制动能曲线EPEcurve.plot(t, EPE)  # 绘制弹性势能曲线EPHcurve.plot(t, EPH)  # 绘制重力势能曲线Ecurve.plot(t, E)  # 绘制系统机械能曲线EEcurve.plot(t, EE)  # 绘制机械能曲线Vcurve.plot(t, ball1.v.y)  # 绘制速度曲线Acurve.plot(t, ball1.a.y)  # 绘制加速度曲线t = t + dt  # 迭代时间

结果:

运行会弹出到浏览器显示

 


http://www.ppmy.cn/news/57502.html

相关文章

C++:分治算法之输油管道问题

目录 描述 输入 输出 输入样例 输出样例 分析 代码 运行结果 描述 ¢ 某石油公司计划建造一条 由东向西 的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经&#xff08;或南或北&#xff09;与主管道相连。 ¢ 如果给定…

STM-32:SPI通信外设

目录 一、前言二、SPI功能框图三、SPI通信读写数据 一、前言 STM32的SPI外设可用作通讯的主机及从机&#xff0c;支持最高的SCK时钟频率为fpclk/2 (STM32F103型号的芯片默认 fpclk1为 36MHz&#xff0c;fpclk2为 72MHz)&#xff0c;完全支持 SPI协议的4种模式&#xff0c;数据…

Qt音视频开发38-ffmpeg视频暂停录制的设计

一、前言 基本上各种播放器提供的录制视频接口&#xff0c;都是只有开始录制和结束录制两个&#xff0c;当然一般用的最多的也是这两个接口&#xff0c;但是实际使用过程中&#xff0c;还有一种可能需要中途暂停录制&#xff0c;暂停以后再次继续录制&#xff0c;将中间部分视…

Python高级函数2:使用itertools、functools、operator使得代码更高效、可读、可重用

Python高级函数2&#xff1a;使用itertools、functools、operator使得代码更高效、可读、可重用 1. 原理itertools.groupby()functools.partial()operator.attrgetter() 和 operator.itemgetter() 2. 源码参考 Python 是一种功能强大的编程语言&#xff0c;它提供了范围广泛的内…

JavaScript事件

事件流描述的是从页面接收事件的顺序。比如说单击了某个按钮&#xff0c;但是单击事件不仅发生在按钮上&#xff0c;在单击按钮的同时&#xff0c;也单击了按钮的容器元素&#xff0c;甚至是 <body> 、<html> 、document。 事件传播的顺序不同导致存在两种事件流机…

40.java-单列集合Set(HashSet,LinkedHashSet,TreeSet)

Set集合 1.Set集合特点2.Set集合实现类3. HashSet3.1 底层原理3.1.1 哈希表组成3.1.2 哈希值3.1.3 对象的哈希值特点 3.2 数据添加元素的过程3.3 HashSet的三个问题3.4 实例&#xff1a;去除重复元素 4. LinkedHashSet5. TreeSet5.1 特点5.2 集合默认规则5.3 例子5.4 两种比较规…

离散数学集合论

集合论 主要内容 集合基本概念 属于、包含幂集、空集文氏图等 集合的基本运算 并、交、补、差等 集合恒等式 集合运算的算律&#xff0c;恒等式的证明方法 集合的基本概念 集合的定义 集合没有明确的数学定义 理解&#xff1a;由离散个体构成的整体称为集合&#xff0c…

【前端知识】Cookie, Session,Token和JWT的发展及区别(中)

【前端知识】Cookie, Session&#xff0c;Token和JWT的发展及区别&#xff08;中&#xff09; 4. Session4.1 Session的背景及定义4.2 Session的特点&#x1f44d;4.2.1 Session的特点&#x1f440;4.2.2 Session保存的位置 4.3 Session的一些重要/常用属性4.4 Session的认证流…