<font color=#008000>
>作者: 吳姿瑩
>更新:2022.10.21
</font>[color=#008000]
# Lesson06: 直線運動
###### tags: `運動科學模擬` `多元選修` `vpython` `直線運動`
<iframe width="560" height="315" src="https://www.youtube.com/embed/eozi69ZP908" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## :memo:引用函式庫
vpython是在python語法下使用,可將物體視覺化展先出來,並同步可繪畫出相關物理上變數,利用視覺化的方式展現!
故使用上語法和python雷同,而相關使用視覺上的展現須引入vpython的函式庫,寫法如下:
```javascript!=1
from vpython import *
```
- 每個程式語言都以 ==“Hello World!”== 開始吧!
```javascript!=2
text(text='Hello World', pos=vec(0,0,0),color=color.cyan,
billboard=True, emissive=True)
```
1. **位置vec**
其中vec表示vector向量,表這文字text放置的位置在此畫布canvas中所在的位置。
向量皆以3維表示,即為(x,y,z)。
:::spoiler **學生活動**
請更改向量的大小位置,試問vpython中三個向量(x, y, z)的方向順序分別為何?
:::
2. **顏色**
顏色的選擇為cyan青色,vpython可選的顏色為red, green, blue, purple, yellow, orange, cyan, magenta, black, white,同時也可使用HSV顏色語法來表示
```javascript!=3
text(text='Hello World', pos=vec(0,5,0),
color=color.hsv_to_rgb(vector (60/255, 100/255, 100/255)) ,
billboard=True, emissive=True)
```
3. **billboard**
billboard為vpython下text的語法,使用billboard只能唯讀顯示,不能做移動互動式的改變。
4. **觀看視角遠近**
嘗試將手指縮放,所看到的視角遠近皆會改變,也是在3D視覺化展現出來,可以從各個面向觀看運動狀態!
:::spoiler 參考網址
1.色碼表RGB :https://www.ifreesite.com/color/online-color-picker.htm
2.vpython color相關使用語法: https://www.glowscript.org/docs/VPythonDocs/color.html
3.vpython text相關使用語法:https://www.glowscript.org/docs/VPythonDocs/text.html
:::
:::spoiler 學生作業
1. Homework: 請利用vpython,進行文字顯示,將其==文字呈現於畫布正中央==,
請將==程式code以及結果截圖== 至google classroom繳交作業。
2. 完成今日協作平台更新
3. 將code上傳至雲端硬碟中(Lesson06 vpython直線運動)
:::
## :memo:Step1 參數設定
寫程式時通常會將變數寫在最上方,如:運動質點的初速度、加速度等等參數,下方程式碼使用的變數亦用符號代表;未來欲改變不同情境時,可快速的在變數中更改,即可看到運動呈現,無需再至底下的程式當中更改,直接更改最上方參數變數即可。
```javascript!=1
from vpython import *
size = 0.05 # 木塊邊長
L = 1.55 # 地板長度
v = 0.05 # 木塊速度
t = 0 # 時間
dt = 0.01 # 時間間隔
```
其中dt為時間間隔,使用vpython畫出每一時刻的運動狀態以及運動相關數值,故將時間切的很細時,程式將會執行時間拉長,反之,將時間間隔拉很長時,許多細節並未紀錄到,會有較大的誤差,故將==時間間隔設置在0.01==呈現效果即可展現!
## :memo:Step2 畫布、圖表相關設置
- 3D的VPython畫布canvas名稱稱為==scene==,執行時會另外開啟視窗。canvas畫面中右方為 +x 軸方向,上方為 +y 軸方向,射出螢幕方向為 +z 軸方向。畫布的名稱可稱為自己的名稱scene,
```javascript!=8
scene = canvas(title="1D Motion", caption='等速運動',
width=640, height=400, x=0, y=0, center=vec(0, 0.3, 0),
background=vec(204/255,204/255,255/255))
```
1. title 畫布名稱
訂定的名稱,會顯現在畫布的左上角
2. caption 畫布標題
訂定畫布的標題,會顯現在畫布的左下角
3. 畫布的大小
利用width, height來設置畫布大小,其中單位為像素pixel,預設值為width= 640,height= 400。
4. 畫布位置
x、y 表畫面於視窗中顯示的位置。
5. center
center表觀察者的位置,雖視角可以由滑鼠移動改變,一開始的觀察者視角可由座標軸訂定。
6. background 顏色
使用向量表示,此方式為不同方式,是利用RGB的顏色表來表示,每個數值用0~1來表示。
:::spoiler 參考網址
1. vpython canvas設置 :https://www.glowscript.org/docs/VPythonDocs/canvas.html
2. vpython 可畫的物品 :https://vpython.org/contents/docs/primitives.html
3. 色碼表RGB :https://www.ifreesite.com/color/online-color-picker.htm
:::
---
- 設置地板==floor(名稱為floor)==,利用vpython中的物件box,畫一個極薄的地板,使用的尺度為Step1的參數設定。
```javascript!=11
floor = box(pos=vec(0, 0, 0), size=vec(L, 0.01*size, 0.5*L),
color=color.green)
```
1. 向量表示亦為畫面中右方為 +x 軸方向,上方為 +y 軸方向,射出螢幕方向為 +z 軸方向,故在 y方向設置厚度極薄(與箱子相比極為薄)
2. box的位置使用vec來設定,其中位置為box的正中心,故將位置設置在 (0, 0, 0),即在畫布的正中央處。
---
- 設置==木塊(名稱為cube)==,利用vpython中的物件box,畫一木塊
```javascript!=13
cube = box(pos=vec(-0.5*L + 0.5*size, 0.5*size+0.01*size, 0),
length=size, height=size, width=size,
color=color.red, v=vec(v, 0, 0))
```
1. 木塊box的位置pos(即position位置之意)由最左端移動至最右端,其中須考量木塊box的厚度,以及地板的厚度,才能將其木塊放置於地板上。
:::spoiler 參考網址
vpython box設置 :https://vpython.org/contents/docs/box.html
:::
---
- 圖表畫圖大致流程如下:
```flow
st=>start: 開畫布graph(gd)
e=>end: 結束
cond=>condition: 選擇畫圖方式 gcurve(xt)
op=>operation: 每一秒資訊寫入圖中 xt.plot
st->cond->op
cond(yes@True)->op
```
設置圖==graph==,物理上常會繪畫出x-t, v-t, a-t圖來確認斜率以及運動的狀態,所以要畫一圖即要開一個畫布graph讓每一時刻的資料 (如:位置x, 速度v, 加速度a 等等) 可以寫入。
```javascript!=16
gd = graph(title="x-t plot", width=600, height=450,
xmax=35, x=0, y=600, xtitle="t(s)", ytitle="x(m)")
gd2 = graph(title="v-t plot", width=600, height=450,
ymin=0, ymax=0.1, x=0, y=1050, xtitle="t(s)", ytitle="v(m/s)")
xt = gcurve(graph=gd, color=color.red)
vt = gcurve(graph=gd2, color=color.red)
```
1. 開畫布gd 為 x - t圖,開畫布gd2 為 v - t圖
2. gd的畫法為gcurve,將每一時刻的資料點利用連續曲線來表示,其中畫出來的曲線儲存至gd圖中!
3. graph 的語法中有一x, y 數值,其中(x,y)為在瀏覽器打開的頁面中所在的位置!故可從語法中知,gd圖的位置會在gd2的位置之上。
:::spoiler 參考網址
vpytohn graph相關語法:https://vpython.org/contents/docs/graph.html
:::
## :memo:Step3 物體的運動
最後一步即是最富含有物理概念的部分,我們的挑戰即為,要將物理概念簡單的數學形式,寫成程式語言!
```javascript!=25
while(cube.pos.x <= 0.5*L- 0.5*size):
rate(1000)
cube.pos.x += v*dt #x=x0+v*dt
xt.plot(pos = (t, cube.pos.x))
vt.plot(pos = (t, cube.v.x))
t += dt
```
1. 利用while迴圈,當木塊達到畫布右端時(考量木塊厚度)即停止程式
2. rate(1000)即表每秒更新動畫1000次
3. 設置木塊的名稱稱為cube,每秒更新的資訊為木塊的 x 座標位置,故將每時間間距 dt 所移動距離,累加至木塊cube位置的 x 資訊。
4. 每一時刻所更新資訊,皆畫至xt, vt 圖中,橫軸資訊為 t,縱軸資訊為木塊的 x位置(cube.pos.x)與 x方向的速度(cube.v.x)。
5. 儲存完資訊則更新時間間隔資訊 t += dt ,即 t = t + dt 。
:::spoiler **直線運動 完整程式碼**
```javascript=
"""
Auther :吳姿瑩
Date :2022/08/17
version :python3.10.6 vpython7
chapter :直線運動
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值
"""
size = 0.05 # 木塊邊長
L = 1.55 # 地板長度
v = 0.05 # 木塊速度
t = 0 # 時間
dt = 0.01 # 時間間隔
"""
2. 畫面設定
"""
#畫面設定,預設為 640 and 400 像素
#scene:backgroung有三個數字唯色碼表,https://www.ifreesite.com/color/online-color-picker.htm
scene = canvas(title="1D Motion",caption='等速運動', width=640, height=400, x=0, y=0, center=vec(0, 0.3, 0), background=vec(204/255,204/255,255/255))
floor = box(pos=vec(0, 0, 0), size=vec(L, 0.01*size, 0.5*L), color=color.green)
cube = box(pos=vec(-0.5*L + 0.5*size, 0.5*size+0.01*size, 0), length=size, height=size, width=size, color=color.red, v=vec(v, 0, 0))
#畫x-t圖v-t圖設定畫布
#找停止時間,設置x-t圖,x軸最大值
gd = graph(title="x-t plot", width=600, height=450,xmax=35, x=0, y=600, xtitle="t(s)", ytitle="x(m)")
gd2 = graph(title="v-t plot", width=600, height=450,ymin=0, ymax=0.1, x=0, y=1050, xtitle="t(s)", ytitle="v(m/s)")
xt = gcurve(graph=gd, color=color.red)
vt = gcurve(graph=gd2, color=color.red)
"""
3. 物體運動部分, 木塊到達地板邊緣時停止執行
"""
while(cube.pos.x <= 0.5*L- 0.5*size):
rate(1000)
cube.pos.x += v*dt #x=x0+v*dt
xt.plot(pos = (t, cube.pos.x))
vt.plot(pos = (t, cube.v.x))
t += dt
print("所需時間為t = ", t)
```
:::
:::spoiler **學生作業**
1. Homework: 試算木塊直線移動了2(m),初速度為0.05(m/s)[==注意:木塊厚度、地板長度==],所需時間為何?
Requirements要求:
(1)需畫出木塊移動
(2)需畫出木塊x-t圖,v-t圖
(3)需在idle中顯現出移動時間
2. 請將==程式code以及瀏覽器結果截圖、IDLE所需時間螢幕截圖== 至google classroom繳交作業。
3. 完成今日協作平台更新
4. 將code上傳至雲端硬碟中(Lesson06 vpython直線運動)
:::
## :memo:參考網址
1. 色碼表RGB :https://www.ifreesite.com/color/online-color-picker.htm
2. vpython color相關使用語法: https://www.glowscript.org/docs/VPythonDocs/color.html
3. vpython text相關使用語法:https://www.glowscript.org/docs/VPythonDocs/text.html
4. vpython canvas設置 :https://www.glowscript.org/docs/VPythonDocs/canvas.html
5. vpython 可畫的物品 :https://vpython.org/contents/docs/primitives.html
6. vpython box設置 :https://vpython.org/contents/docs/box.html
7. vpytohn graph相關語法:https://vpython.org/contents/docs/graph.html