直接点击“开始运行”观察默认弹簧链。需要自己搭建时,设置小球数量、默认质量、刚度和原长后生成场景;点击小球或弹簧可单独改参数。工具栏可增加小球、固定点、自由连线或删除对象。
拖拽或应用参数会先暂停,再将当前状态作为新起点;“重置”回到这个起点。当前状态包括其他小球当时的位置与速度。操作失误可撤销。手动连线默认以当时距离作为原长,需要拖开一个端点或设置初速度才会运动。
这里的“弹力设置”是刚度 k(N/m),不是固定力值。弹簧可拉伸也可压缩,沿两端连线施力,不发生塑性变形或断裂。没有重力、空气阻力、摩擦、碰撞或墙壁;小球按质点计算,可以相互穿过。固定点不移动,也不计入小球数量。单位使用 m、kg、s、N。
如果全部弹簧恰好处于原长、全部初速度为零,系统不会自行运动。运行时机械能会在动能和势能之间转换;数值积分存在误差,不宣称严格能量守恒。手动拖拽、改质量或改弹簧参数会改变系统能量。
使用原生 Canvas 2D,无外部脚本、图片、字体或物理引擎。Velocity Verlet 积分使用不大于 1/240 秒的子步;根据当前弹簧刚度、压缩程度和质量自动进一步细分。画面由 requestAnimationFrame 调度,目标上限 60 FPS,渲染与模拟时间分离。右上角为实际绘制帧率,不是固定标签。
支持最多 200 个小球、32 个独立固定点、800 根弹簧。此上限是编辑容量,不是任何设备上的 60 FPS 承诺;浏览器、屏幕刷新率、节电模式和计算规模都会影响实际帧率。性能不足时自动简化显示;物理运算超出每帧预算时显示“模拟降速”,不通过增大积分步长假装实时。后台标签页会自动暂停,返回后手动继续。
弹簧两端完全重合时方向未定义,编辑与导入阶段会拒绝此类已连接状态。运动中极近距离会缩小子步;若需要低于 10⁻⁷ 秒的步长,程序暂停并提示调整参数,而不是暗中截断弹力。运动过远时可用“适配”重新取景。
单球预设是一个固定点加一个小球;链式两端固定;环形无固定点;网格将顶部一排小球固定,并增加对角弹簧(其原长为边长的 √2 倍)。初始扰动按默认原长的倍数设置,主要用于给系统初始势能,不是持续外力。
鼠标滚轮缩放,拖动空白处平移;触屏支持拖动与双指缩放。空格 开始/暂停;V 选择;B 小球;A 固定点;C 连线;Delete 删除选中;R 重置;Ctrl/⌘ Z 撤销;Ctrl/⌘ Shift Z 重做。输入框内不抢占快捷键。
保存到本机只写入当前浏览器的 localStorage。部分浏览器会限制 file:// 页面的本地存储,请使用 JSON 导出作为可靠备份;JSON 保存当前物理状态,导入后保持暂停。所有处理均在本地,不上传任何数据。HTML 可以直接打开,也可以作为静态页面放到自己的服务器。
2026-09-18,在自动化 Chromium 无头浏览器、1440 × 960 视口中完成 23 项功能与数值检查。检查包括单球周期、作用力与反作用力、动量、静止状态、质量与坐标编辑、独立弹簧参数、拖拽、单步、重置、撤销重做,以及 JSON 导入导出和无效文件拒绝。
每组性能场景连续采样约 3.5 秒:5 球 / 6 弹簧、200 球 / 201 弹簧、200 球 / 715 弹簧均约 60 FPS;网格场景使用 m = 1 kg、k = 30 N/m,另测 m = 0.05 kg、k = 1000 N/m 组合也约 60 FPS。该结果只反映交付时的测试环境与短时采样,不是用户设备的实测,也不是长时间满载或所有参数的保证。
单球解析周期验证:推进 10 个理论周期,终点位置误差约 5.6 × 10⁻⁷ m。双自由质点实验累计约 100 模拟秒,最大相对能量误差约 0.0087%。5 种视口(含手机竖屏、横屏和平板)均无横向溢出,运行按钮保持可见。
本文件独立编写,未复制以下项目代码,也不加载它们的依赖。查阅日期:2026-09-18。
PhET · masses-and-springs:弹簧教学模拟与参数交互。
AntonMartic · Spring-Mass-Simulation:互联质点、拖拽、参数设置和积分方法。
MDN · requestAnimationFrame:帧调度、刷新率与后台暂停行为。
直接修改质量和坐标。提交后作为新起点;固定点的质量不参与计算。
| 编号 | 类型 | 质量 kg | X / m | Y / m | 固定 |
|---|