---
# System prepended metadata

title: 自主學習成果報告：物理運動模擬

---

# 自主學習成果報告

## 主題：物理運動模擬——以程式模擬拋體與萬有引力運動

## 一、學習動機與目標

我對物理中的力學十分感興趣，尤其是透過數學公式模擬物體實際運動的過程。透過這次自主學習，我希望能夠將課堂上學到的運動定律，結合電腦程式實作，例如用 C++ 和 Raylib 套件模擬拋體運動、萬有引力下的行星運動等。

### 學習目標：

1. 熟悉基本的物理運動模型（直線、自由落體、斜拋、圓周、重力軌道等）。
2. 利用程式語言將數學公式轉換為模擬程式。
3. 完成一個互動式模擬作品，並理解其背後的物理意義。

---

## 二、學習計畫與方法

### 學習計畫表：

| 週次  | 內容                                 | 備註                       |
| --- | ---------------------------------- | ------------------------ |
| 第1週 | 查閱相關模擬案例，決定模擬主題與開發工具（Raylib + C++） | 參考 YouTube 與 GitHub 上的專案 |
| 第2週 | 溫習拋體運動與重力定律                        | 整理出運動方程式                 |
| 第3週 | 開始撰寫基本模擬框架（初始化、顯示畫面、繪製物體）          | 完成一個簡單小球動畫               |
| 第4週 | 實作拋體運動模擬，加入使用者互動功能（設定初速度、角度）       | 測試不同參數對軌跡的影響             |
| 第5週 | 加入重力模擬，模擬行星繞太陽運動                   | 完成成果報告                      | 

### 學習方法：

* 利用AI查詢 Raylib 文件
* 與同學討論物理模型與模擬策略
* 撰寫學習筆記與數學推導過程

---

## 三、學習內容與成果

### 模擬項目 1：斜拋運動模擬

* 利用公式

  $$
  x = v_0 \cos(\theta)t,\quad y = v_0 \sin(\theta)t - \frac{1}{2}gt^2
  $$
  
* 球體間彈性碰撞推導

設兩球為 A、B，質量分別為 $m_1, m_2$，速度分別為向量 $\vec{v}_1, \vec{v}_2$，位置為 $\vec{p}_1, \vec{p}_2$。
當兩球發生碰撞時，假設為**瞬間碰撞**，並假設球為圓形、剛體、無旋轉。

1. **找出碰撞方向的單位向量（法線方向）：**

   $$
   \hat{n} = \frac{\vec{p}_1 - \vec{p}_2}{\|\vec{p}_1 - \vec{p}_2\|}
   $$

2. **計算相對速度在該方向的投影（撞擊量）：**

   $$
   v_{rel} = (\vec{v}_1 - \vec{v}_2) \cdot \hat{n}
   $$

3. **若兩球正在靠近才處理碰撞：**
   如果 $v_{rel} > 0$，表示兩球正在遠離，不處理碰撞。

4. **根據彈性碰撞公式，計算衝量 J：**

   $$
   J = \frac{2 m_1 m_2}{m_1 + m_2} \cdot v_{rel}
   $$

5. **更新速度：**

   $$
   \vec{v}_1' = \vec{v}_1 - \frac{J}{m_1} \cdot \hat{n}, \quad \vec{v}_2' = \vec{v}_2 + \frac{J}{m_2} \cdot \hat{n}
   $$


---


### 模擬項目 2：萬有引力模擬

* 利用萬有引力公式

  $$
  F = G\frac{m_1m_2}{r^2}
  $$
* 對物體施加重力加速度並更新位置
* 成果：模擬小球繞行固定「太陽」的軌道運動，可觀察速度改變下的軌跡變化（如圓形、橢圓、拋物線、雙曲線）

### 程式與成果展示：

* 程式碼：[https://github.com/Benson0212/physics-simulator-raylib/blob/main/selfLearning/test.cpp](https://github.com/Benson0212/physics-simulator-raylib/blob/main/selfLearning/test.cpp)
* 成果照
![image](https://hackmd.io/_uploads/Hk4sLl7Vxg.png)
![螢幕擷取畫面 2025-06-20 223728](https://hackmd.io/_uploads/Hk46zl7Nex.png)

---

## 四、反思與收穫

透過這次模擬專題，我深刻體會到物理運動不僅存在於紙上公式，更可以透過程式來「看見」它們。從一開始遇到碰撞偵測與數值誤差等問題，到後來慢慢修正公式與學會除錯，我也提升了寫程式的能力與邏輯思考能力。此外，透過與同學分享，我也學會如何表達抽象的物理概念。

---

## 五、附件與參考資料

* 自主筆記連結：https://hackmd.io/KUdothWmRjaQkpHPys91rA?view
* GitHub 專案連結：https://github.com/Benson0212/physics-simulator-raylib
* Raylib 官方網站：[https://www.raylib.com](https://www.raylib.com)

