## 初探Vpython-等速直線運動
#### by Switch
---
## 介紹
----
Vpython是Python的視覺化套件,
經常被拿來寫物理情境的模擬。
P.S. 台大有一門課就在教你這個
----
一般而言結構會長這樣
數值定義 \\(\to\\) 建立物體 \\(\to\\) 帶入物理邏輯
----
Vpython也可以下載套件,在線下編輯
```
pip install vpython
```
本次教學使用線上工具
### Glowscript

---
## 事前準備
----
搜尋[Glowscript](https://www.glowscript.org),進入頁面後點選Sign in

----
登入後,點擊自己的帳號

----
最後就可以Creat a program,開始打code了

----
如果你不喜歡如此陽春的介面,還有另一個也不錯用的網站,請見最後面補充
---
## 基礎語法
----
### 各種物件
```Vpython
item1 = box(pos, size, color) #方塊
item2 = sphere(pos, radius, color) #球體
item3 = helix(pos, radius, thickness, color) #螺旋體(模擬彈簧)
item4 = arrow(pos, axis, shaftwidth, color) #箭頭
item5 = cylinder(pos, axis, radius, color) #線
```
今天只會用到 item1,也就是
```
BOX = box(pos, size, velocity, acceleration, color)
```
註:velocity 和 acceleration 視模擬情境而加
----
### 環境建立
```vpython
scene=canvas(title, width, height, x=0, y=0, center, color) #背景
floor = box(pos, size, color) #地板習慣用大箱子
```
----
### 空間的定義
在Vpython裡,我們會這麼定義x、y、z軸

----
### 座標的定義
給立方體一個座標,此座標為立方體的中心點

上圖為座標給定為\\((0,0,0)\\)時,方塊的位置
---
### 那就來實作吧
----
#### 本次實作內容:等速直線運動
----
第一步要先定義一些要用的數字
```vpython
from vpython import *
s = 2 #方塊大小
L = 40 #地板長度
dt = 0.001 #時間間隔
t = 0 #時間
```
----
接著照前述方式建立好一個環境
```vpython
scene=canvas(title="等速直線運動", width=600,height=600, x=0, y=0, center=vec(0,10,-5), background=vec(0.3,0,0.7))
floor = box(pos=vec(0,0,0), size=vec(L,0.1,10), color=color.cyan)
```
----
然後我們需要一個運動的物體
(此處以方塊作為示範)
```vpython
block=box(pos=vec(-L*0.5, floor.pos.y+((floor.size.y)/2)+(s/2), 0),size=vec(s,s,s),v=vec(2,0,0),color=color.red)
```
----
最後就是物理模擬部分,由於只能是“模擬”,
因此無法真的做到百分百還原現實狀況。
但是我們還是能盡量仿真
----
我們是這樣處理的:
把時間間隔壓到很小,並且時時刻刻更新數值
----
具體實作
```
while(block.pos.x + s/2 < floor.pos.x + L/2): #走到地板的邊邊為止
rate(1000) #每秒做1000次
block.pos += block.v * dt #在dt秒內,方塊會移動v×dt單位長度
t += dt
```
---
[成果演示](https://trinket.io/glowscript/e38d2b3b26?outputOnly=true)
---
## 補充
----
你也可以使用另一個編輯軟體
### Trinket

----
## 事前準備
----
搜尋[Trinket](https://trinket.io/),進入頁面後選取註冊或登入

----
登入後,點New trinket \\(\to\\) GlowScript

(記得進去後要選Pythonㄛ)
---
# 謝謝大家
{"metaMigratedAt":"2023-06-18T07:10:57.408Z","metaMigratedFrom":"YAML","breaks":true,"contributors":"[{\"id\":\"084e105f-92be-4605-b399-8d3c0ef40c64\",\"add\":3437,\"del\":885}]","title":"Vpython-等速直線運動"}