弹簧质点系统(C++实现)

本文实现一个简单的物理算法:弹簧质点系统(Mass-Spring System)。这是一个经典的物理模拟算法,常用于模拟弹性物体(如布料、弹簧等)的行为。我们将使用C++来实现这个算法,并结合链表数据结构来管理质点和弹簧。

1. 问题描述

弹簧质点系统由多个质点和连接它们的弹簧组成。每个质点受到重力和弹簧力的作用,我们可以通过牛顿第二定律计算质点的加速度,进而更新其速度和位置。

2. 数据结构设计

  • 质点(Mass):包含质量、位置、速度、加速度等属性。
  • 弹簧(Spring):连接两个质点,包含弹簧常数、自然长度等属性。
  • 系统(System):管理所有质点和弹簧,使用链表存储。

3. 算法实现

#include <iostream>
#include <vector>
#include <cmath>// 定义二维向量
struct Vector2 {double x, y;Vector2(double x = 0, double y = 0) : x(x), y(y) {}Vector2 operator+(const Vector2& other) const {return Vector2(x + other.x, y + other.y);}Vector2 operator-(const Vector2& other) const {return Vector2(x - other.x, y - other.y);}Vector2 operator*(double scalar) const {return Vector2(x * scalar, y * scalar);}double length() const {return std::sqrt(x * x + y * y);}
};// 质点类
struct Mass {double mass;       // 质量Vector2 position;  // 位置Vector2 velocity;  // 速度Vector2 force;     // 受力Mass(double m, Vector2 pos) : mass(m), position(pos), velocity(0, 0), force(0, 0) {}void applyForce(Vector2 f) {force = force + f;}void update(double dt) {Vector2 acceleration = force * (1.0 / mass);  // 牛顿第二定律velocity = velocity + acceleration * dt;      // 更新速度position = position + velocity * dt;         // 更新位置force = Vector2(0, 0);                        // 重置受力}
};// 弹簧类
struct Spring {Mass* mass1;  // 连接的质点1Mass* mass2;  // 连接的质点2double k;     // 弹簧常数double restLength;  // 自然长度Spring(Mass* m1, Mass* m2, double k, double restLen): mass1(m1), mass2(m2), k(k), restLength(restLen) {}void applyForce() {Vector2 delta = mass2->position - mass1->position;double length = delta.length();double forceMagnitude = k * (length - restLength);  // 胡克定律Vector2 force = delta * (forceMagnitude / length);mass1->applyForce(force);mass2->applyForce(force * -1);}
};// 系统类
struct System {std::vector<Mass*> masses;    // 质点链表std::vector<Spring*> springs; // 弹簧链表void addMass(Mass* mass) {masses.push_back(mass);}void addSpring(Spring* spring) {springs.push_back(spring);}void update(double dt) {// 应用重力for (auto mass : masses) {mass->applyForce(Vector2(0, -9.8 * mass->mass));  // 重力}// 应用弹簧力for (auto spring : springs) {spring->applyForce();}// 更新质点状态for (auto mass : masses) {mass->update(dt);}}
};int main() {// 创建系统System system;// 创建质点Mass* mass1 = new Mass(1.0, Vector2(0, 0));Mass* mass2 = new Mass(1.0, Vector2(2, 0));system.addMass(mass1);system.addMass(mass2);// 创建弹簧Spring* spring = new Spring(mass1, mass2, 10.0, 1.0);system.addSpring(spring);// 模拟double dt = 0.01;  // 时间步长for (int i = 0; i < 100; i++) {system.update(dt);std::cout << "Mass1 Position: (" << mass1->position.x << ", " << mass1->position.y << ")\n";std::cout << "Mass2 Position: (" << mass2->position.x << ", " << mass2->position.y << ")\n";}// 释放内存delete mass1;delete mass2;delete spring;return 0;
}

4. 代码解释

  1. Vector2:表示二维向量,支持加减乘等操作。
  2. Mass:表示质点,包含质量、位置、速度、受力等属性,并提供更新状态的方法。
  3. Spring:表示弹簧,连接两个质点,根据胡克定律计算弹簧力并应用到质点上。
  4. System:管理所有质点和弹簧,提供更新系统状态的方法。
  5. main函数:创建系统、质点和弹簧,并进行模拟。

5. 运行结果

程序会输出两个质点的位置随时间的变化,模拟弹簧质点系统的运动。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75980.shtml

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

相关文章

领域大模型

领域技术标准文档或领域相关数据是领域模型Continue PreTrain的关键。 现有大模型在预训练过程中都会加入书籍、论文等数据&#xff0c;那么在领域预训练时这两种数据其实也是必不可少的&#xff0c;主要是因为这些数据的数据质量较高、领域强相关、知识覆盖率&#xff08;密度…

Wincc项目被锁定无法打开

Wincc项目被锁定无法打开 解决方法 解决方法 一般这种情况是因为项目打开的时候直接关机导致的。 删除项目文件夹的ProjectOpened.lck的文件夹即可 然后即可正常打开项目

SpringBoot3笔记

简介&#xff1a; springboot整合了springframework&#xff0c;整合了许多配置&#xff0c;让我们能够快速创建一个以springframework为基础的项目。 问题&#xff1a; 到目前为止&#xff0c;你已经学习了多种配置Spring程序的方式。但是无论使用XML、注解、Java配置类还是…

DeepSeek和文心一言的区别

文章目录 1.开发公司&#xff1a;2.应用场景&#xff1a;3.训练数据&#xff1a;4.模型架构&#xff1a;5.技术特点&#xff1a;6.语言风格&#xff1a;7.开源性&#xff1a;8.界面与用户体验&#xff1a; 1.开发公司&#xff1a; DeepSeek 由杭州深度求索人工智能基础技术研究…

Windows 10 安装Mysql 8

安装准备 下载 MySQL Windows ZIP版&#xff08;无安装程序&#xff09;&#xff1a; 进入官网&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择 Windows → 下载 ZIP Archive&#xff0c;例如&#xff1a; mysql-8.0.34-winx64.zip 如果你的电脑没有安装 VC Redi…

ARM分拣机vs传统PLC:实测数据揭示的4倍效率差

在苏州某新能源汽车零部件仓库&#xff0c;凌晨3点的分拣线上依然灯火通明。8台搭载ARM Cortex-A72处理器的智能分拣机正在以每秒3件的速度处理着形状各异的电池包组件&#xff0c;它们通过MES系统接收订单信息&#xff0c;自主规划最优路径&#xff0c;将不同规格的零部件精准…

使用python访问mindie部署的vl多模态模型

说明 今天使用mindie1.0部署了qwen2_7b_vl模型&#xff0c;测试过程出现一些问题&#xff0c;这里总结下。 问题1&#xff1a;transformers版本太低 报错信息&#xff1a; [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…

vscode 跳转失败之c_cpp_properties.json解析

{"configurations": [{"name": "Linux", // 配置名称&#xff0c;对应当前平台&#xff0c;VS Code 中可选"includePath": ["${workspaceFolder}/**", // 包含当前工作区下所有文件夹的头文件&#xff08;递归&…

飞速(FS)解决方案验证实验室搬迁升级,赋能客户技术服务

飞速&#xff08;FS&#xff09;解决方案验证实验室近日顺利完成搬迁升级&#xff0c;标志着飞速&#xff08;FS&#xff09;在解决方案可行性验证、质量保障以及定制化需求支持方面迈上新台阶&#xff0c;进一步提升了产品竞争力和客户信任度。 全新升级的实验室定位为技术验证…

安装kerberos认证的cdh环境

1、服务端安装 1.1 安装wget yum -y install wget 由于本地已安装过wget&#xff0c;所以显示Nothing to do 1.2 进入 home 目录 cd /home 1.3 下载centos6.7.iso文件&#xff0c;并挂载 wget https://archive.kernel.org/centos-vault/6.7/isos/x86_64/CentOS-6.7-x86_64…

MySQL基础 [六] - 内置函数+复合查询+表的内连和外连

内置函数一般要用select调用 内置函数 日期函数 current_date函数 current_date函数用于获取当前的日期。如下&#xff1a; current_time函数 current_time函数用于获取当前的时间。如下&#xff1a; now函数 now函数用于获取当前的日期时间。如下&#xff1a; date函数 dat…

CS内网渗透 - 如何通过冰蝎 Webshell 上线 Weblogic 服务器到 Cobalt Strike 并绕过杀软检测(360、火绒)?

目录 1. 冰蝎连接上 Weblogic 服务器如何上线到 Cobalt Strike 2. 服务器安装杀毒工具如何绕过杀软上线到 Cobalt Strike 2.1 杀软对 Webshell 命令执行的检测及绕过 2.2 杀软对 Cobalt Strike 上线木马的检测及绕过 2.3 杀软对这两方面的限制及综合绕过 3. 如何生成免杀…

[ctfshow web入门] web10

前置知识 cookie Cookie是网站存储在浏览器中的小数据片段&#xff0c;用于识别用户、保持登录状态或记住偏好设置。 也就是说&#xff0c;我以会员A的身份登录了网站&#xff0c;网站会发送一段cookie(会员卡)给我&#xff0c;上面写着会员卡A&#xff0c;下一次我再访问&am…

蓝桥杯:日期统计

文章目录 问题描述解法一递归解法二&#xff1a;暴力破解 问题描述 首先我们要了解什么是子序列&#xff0c;就是一个序列之中可以忽略元素但是不能改变顺序之后获得的序列就叫做子序列。 如"123"就是"11234"的子序列而不是"11324"的子序列 解法…

蓝桥杯 C/C++ 组历届真题合集速刷(一)

一、1.单词分析 - 蓝桥云课 &#xff08;模拟、枚举&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;unordered_map<char,int> mp;for(auto ch:s){mp[ch];}char result_charz;int max_count0;fo…

重塑知识的引擎:人工智能如何改变知识的生产与传播

一、引言&#xff1a;知识的边界正在被人工智能重构 千百年来&#xff0c;人类对于“知识”的获取方式一直遵循着某种路径依赖&#xff1a;感知现实 → 归纳总结 → 文字表达 → 教育传承 → 学术沉淀。这一过程复杂而缓慢&#xff0c;需要经过代际的努力才能实现知识的积累与…

list的底层:

我们之前讲解了list&#xff0c;今天我们来看一下list的底层&#xff1a; list底层是一个双向带头循环的链表&#xff0c;之前我们学习数据结构的时候&#xff0c;我们就学过。 迭代器的封装&#xff1a; 我们看这个图片&#xff0c;我们的链表的指针可以达到链表的迭代器能力…

遵循IEC62304YY/T0664:确保医疗器械软件生命周期合规性

一、EC 62304与YY/T 0664的核心定位与关系 IEC 62304&#xff08;IEC 62304&#xff09;是国际通用的医疗器械软件生命周期管理标准&#xff0c;适用于所有包含软件的医疗器械&#xff08;如嵌入式软件、独立软件、移动应用等&#xff09;&#xff0c;其核心目标是确保软件的安…

【next函数python】`next()`函数

在Python中&#xff0c;next()函数结合生成器表达式用于高效地查找序列中第一个符合条件的元素。以下是如何理解和编写类似代码的步骤&#xff1a; 1. 生成器表达式 生成器表达式&#xff08;如 (e for e in energy3 if e ! 0)&#xff09;是一种惰性计算的迭代结构。它不会一…

[创业之路-364]:穿透表象:企业投资的深层逻辑与误区规避

前言&#xff1a; 透过现象看本质 企业一生与人生相似 看企业如同看人 三岁看大&#xff0c;七岁看老 三十年河东&#xff0c;三十年河西 企业也有品行、文化、气质、性格、赚钱、生命周期与赚钱曲线 投资公司的目的是未来赚钱&#xff0c;赚未来赚钱。投资创业中的企业主要看…