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

打印 上一主题 下一主题

主题 1670|帖子 1670|积分 5010

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

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



  • 质点(Mass):包含质量、位置、速度、加速度等属性。
  • 弹簧(Spring):毗连两个质点,包含弹簧常数、自然长度等属性。
  • 系统(System):管理全部质点和弹簧,使用链表存储。
3. 算法实现

  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. // 定义二维向量
  5. struct Vector2 {
  6.     double x, y;
  7.     Vector2(double x = 0, double y = 0) : x(x), y(y) {}
  8.     Vector2 operator+(const Vector2& other) const {
  9.         return Vector2(x + other.x, y + other.y);
  10.     }
  11.     Vector2 operator-(const Vector2& other) const {
  12.         return Vector2(x - other.x, y - other.y);
  13.     }
  14.     Vector2 operator*(double scalar) const {
  15.         return Vector2(x * scalar, y * scalar);
  16.     }
  17.     double length() const {
  18.         return std::sqrt(x * x + y * y);
  19.     }
  20. };
  21. // 质点类
  22. struct Mass {
  23.     double mass;       // 质量
  24.     Vector2 position;  // 位置
  25.     Vector2 velocity;  // 速度
  26.     Vector2 force;     // 受力
  27.     Mass(double m, Vector2 pos) : mass(m), position(pos), velocity(0, 0), force(0, 0) {}
  28.     void applyForce(Vector2 f) {
  29.         force = force + f;
  30.     }
  31.     void update(double dt) {
  32.         Vector2 acceleration = force * (1.0 / mass);  // 牛顿第二定律
  33.         velocity = velocity + acceleration * dt;      // 更新速度
  34.         position = position + velocity * dt;         // 更新位置
  35.         force = Vector2(0, 0);                        // 重置受力
  36.     }
  37. };
  38. // 弹簧类
  39. struct Spring {
  40.     Mass* mass1;  // 连接的质点1
  41.     Mass* mass2;  // 连接的质点2
  42.     double k;     // 弹簧常数
  43.     double restLength;  // 自然长度
  44.     Spring(Mass* m1, Mass* m2, double k, double restLen)
  45.         : mass1(m1), mass2(m2), k(k), restLength(restLen) {}
  46.     void applyForce() {
  47.         Vector2 delta = mass2->position - mass1->position;
  48.         double length = delta.length();
  49.         double forceMagnitude = k * (length - restLength);  // 胡克定律
  50.         Vector2 force = delta * (forceMagnitude / length);
  51.         mass1->applyForce(force);
  52.         mass2->applyForce(force * -1);
  53.     }
  54. };
  55. // 系统类
  56. struct System {
  57.     std::vector<Mass*> masses;    // 质点链表
  58.     std::vector<Spring*> springs; // 弹簧链表
  59.     void addMass(Mass* mass) {
  60.         masses.push_back(mass);
  61.     }
  62.     void addSpring(Spring* spring) {
  63.         springs.push_back(spring);
  64.     }
  65.     void update(double dt) {
  66.         // 应用重力
  67.         for (auto mass : masses) {
  68.             mass->applyForce(Vector2(0, -9.8 * mass->mass));  // 重力
  69.         }
  70.         // 应用弹簧力
  71.         for (auto spring : springs) {
  72.             spring->applyForce();
  73.         }
  74.         // 更新质点状态
  75.         for (auto mass : masses) {
  76.             mass->update(dt);
  77.         }
  78.     }
  79. };
  80. int main() {
  81.     // 创建系统
  82.     System system;
  83.     // 创建质点
  84.     Mass* mass1 = new Mass(1.0, Vector2(0, 0));
  85.     Mass* mass2 = new Mass(1.0, Vector2(2, 0));
  86.     system.addMass(mass1);
  87.     system.addMass(mass2);
  88.     // 创建弹簧
  89.     Spring* spring = new Spring(mass1, mass2, 10.0, 1.0);
  90.     system.addSpring(spring);
  91.     // 模拟
  92.     double dt = 0.01;  // 时间步长
  93.     for (int i = 0; i < 100; i++) {
  94.         system.update(dt);
  95.         std::cout << "Mass1 Position: (" << mass1->position.x << ", " << mass1->position.y << ")\n";
  96.         std::cout << "Mass2 Position: (" << mass2->position.x << ", " << mass2->position.y << ")\n";
  97.     }
  98.     // 释放内存
  99.     delete mass1;
  100.     delete mass2;
  101.     delete spring;
  102.     return 0;
  103. }
复制代码
4. 代码表明


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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表