彈簧質點系統(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.pswp.cn/pingmian/75980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75980.shtml
英文地址,請注明出處:http://en.pswp.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;賺未來賺錢。投資創業中的企業主要看…