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

news2024/11/26 13:45:03

代码:

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.orange
        else:
            vector_f.color = color.purple
        f_label.pos = vector_f.pos + vector_f.axis * 1.2  # 设置弹力标签位置
        f_label.pos.x = f_label.pos.x - 0.1
        f_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.1
    g_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.coloradmin.cn/o/477751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

solidity 安全 如何阻止重入攻击

什么是可重入攻击&#xff1f; 我们使用合约的过程中&#xff0c;经常会遇到这种情况&#xff0c;智能合约能够调用外部的合约&#xff1b;这些外部合约又可以回调到调用他们的智能合约&#xff1b;在这种情况下&#xff0c;我们说智能合约被重新输入&#xff0c;这种情况被称为…

守护进程Daemon

进程组、对话期和控制终端关系 每个会话有且只有一个前台进程组&#xff0c;但会有0个或者多个后台进程组。产生在控制终端上的输入&#xff08;Input&#xff09;和信号&#xff08;Signal&#xff09;将发送给会话的前台进程组中的所有进程。对于输出&#xff08;Output&…

给大家介绍几个手机冷门但好用的小技巧

技巧一&#xff1a;拍照识别植物 手机的拍照识别植物功能是指在使用手机相机时&#xff0c;可以通过对植物进行拍照&#xff0c;并通过植物识别技术&#xff0c;获取植物的相关信息和资料。其主要优点如下&#xff1a; 方便实用&#xff1a;使用拍照识别植物功能&#xff0c;…

Small Tip: 怎么去Schedule一个Analysis for Office的workbook

workbook的query不能是本地的&#xff0c;也就是说不能是在包$Tmp里面的。这种的没办法在BO里面用SSO。也就没办法Schedule。 前提条件有&#xff1a; 1.BO和BW系统的SSO配置得OK。 如果没有SSO&#xff0c;那么每次打开workbook就会有一个要登录BW的弹窗&#xff0c;这样是…

从零开始学习Linux运维,成为IT领域翘楚(三)

文章目录 &#x1f525;Linux超级用户与伪用户&#x1f525;Linux文件基本属性&#x1f525;Linux权限字与权限操作 &#x1f525;Linux超级用户与伪用户 Linux下用户分为三类&#xff1a;超级用户、普通用户、伪用户 ⭐ 超级用户&#xff1a;用户名为root&#xff0c;具有一切…

初识 OPC

为什么需要OPC&#xff1f; 随着自动化的发展&#xff0c;工厂的自动化程度越来越高&#xff0c;面临着问题&#xff1a; 设备之间&#xff0c;设备与应用程序之间交互数据 不同产商设备/应用程序具有不同接口/通信协议&#xff0c;如何简单快速连接&#xff1f;采集的数据及…

【计算机网络】学习笔记:第四章 网络层【王道考研】更新中....

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

计算机组成原理4.2.2汉明码

编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式&#xff0c;确定增添几位&#xff0c;根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则&#xff1a;哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…

JUnit 5 使用教程 及 JUnit 4/5的差异

1. JUnit 5产生的原因 JDK 8在java中带来了迷人的功能,最值得注意的是lambda表达式 为了适应 Java 8 风格的编码和新的功能特性,JUnit 提供了JUnit 5 2. JUnit 5 架构 与 JUnit 4 相比,JUnit 5 由来自三个不同子项目的几个不同模块组成:JUnit 5 = JUnit Platform + JUni…

controlnet1.1模型和预处理器功能详解(各预处理器出稿对比及对应模型说明)

ControlNet 1.1 与 ControlNet 1.0 具有完全相同的体系结构,ControlNet 1.1 包括所有以前的模型&#xff0c;具有改进的稳健性和结果质量&#xff0c;且增加并细化了多个模型。 命名规范 项目名版本号标识基础模型版本功能名文件后缀名 control 官方总是以control为项目名&…

Java NIO(Java Non-Blocking IO:非阻塞式IO)(2)

1.NIO非阻塞网络编程原理分析 1>.NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel)关系梳理图: 说明: ①.当客户端连接时,会通过服务器端ServerSocketChannel得到/生成对应的SocketChannel; ②.通过register(Selector sel,int ops)…

SpringBoot 如何防御 CSRF 攻击

SpringBoot 如何防御 CSRF 攻击 CSRF 原理CSRF实践CSRF防御前后端不分离方案前后端分离方案 CSRF 就是跨域请求伪造&#xff0c;英文全称是 Cross Site Request Forgery。 这是一种非常常见的Web攻击方式&#xff0c;其实是很好防御的&#xff0c;但是由于经常被很多开发者忽略…

压缩HTML引用字体

内容简介 有些网站为了凸显某部分字体&#xff0c;而引入自定义字体&#xff0c;但由于自定义字体相对都比较大&#xff08;几M&#xff09;,导致页面加载缓慢&#xff1b;所以本文介绍三种压缩字体的方法&#xff0c;可根据项目情况自行选择。 压缩方法 1、利用Fontmin程序&a…

ETL工具 - Kettle 输入输出算子介绍

一、Kettle 输入输出算子介绍 上篇文章对 Kettle 进行了简单的介绍及做了个简单的案例&#xff0c;但是对 Kettle 的Step算子工具没有做过多的解释&#xff0c;本篇文章从输入输出算子工具开始进行介绍。 下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 介绍及基本使用 …

正点原直流有刷驱动板的硬件解说

这里写目录标题 H桥电流采集电路电源电压采集电路温度采集电路过流检测电路过流保护电路![请添加图片描述](https://img-blog.csdnimg.cn/fa130e17e23b471e8e27ae942e1ff125.png) H桥 因为光耦(EL0631)作用&#xff0c;PWM 引脚电平输入IN相反。 然后半桥芯片的逻辑表为&#x…

【Python】BeautifulSoup

一、什么是BeautifulSoup Beautiful Soup 简称 BS4&#xff08;其中 4 表示版本号&#xff09;是一个 Python 第三方库&#xff0c;它可以从 HTML 或 XML 文档中快速地提取指定的数据。 二、BS4下载安装 点击最下面的终端进如命令行界面 &#xff08;进入成功界面&#xff1a;&…

C++/Qt 小知识记录3

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识 QLineEdit限制输入大于0的正整数QLayout内清空已布局的WidgetWindows结束进程直接结束&#xff0c;子进程不响应结束事件正常结束&#xff0c;子进程响应结束事件 CMake关闭控制台Console实体与值对…

【网络编程】网络基础知识总结

文章目录 一、局域网与广域网二、协议2.1 协议的概念2.2 协议分层2.3 数据传输的条件 三、OSI七层模型四、TCP/IP五层&#xff08;四层&#xff09;模型五、网络传输5.1 预备知识——报头5.2 局域网通信原理5.3 以太网和令牌环网5.3 网络传输流程图5.3.1 同一网段的两台计算机的…

海岛旅行回忆总结(不定更)

文章目录 概述大辣甲岛外伶仃岛、东澳岛长洲、南丫岛下川岛 概述 喜欢大海&#xff0c;与海滩相比&#xff0c;海岛的空气更好、海水更靓、人更少、污染更少 海岛位置日期天气小结大辣甲岛惠州2017年7月29~30日台风前夕&#xff0c;云淡风轻&#xff0c;阳光猛烈开发程度低&…

分享2款CSS3母亲节主题寄语文字动画特效

目录 ❤️ 前言 第一款&#xff1a;妈妈您辛苦了&#xff01; 一、效果图 二、代码实现 第二款&#xff1a;Mothers Day&#xff01; 一、效果图 二、代码实现 ❤️ 祝福 ❤️ 前言 母亲节&#xff0c;在每年五月的第二个星期日&#xff0c;是用来感谢母亲的节日。…