<!-- -->
<style>
body {
overflow: hidden;
}
body > .ui-infobar, body > .ui-toc, body > .ui-affix-toc {
display: none !important;
}
.container {
padding-left: 0px;
margin-right: auto;
margin-left: 0px;
}
.markdown-body {
padding-left: 80px;
padding-top: 20px;
padding-bottom: 80px;
font-family: Microsoft JhengHei,Helvetica,Arial;
}
h1{color: #0090E0; font-weight: bold;}
h2{color: #0090E0; font-weight: bold;}
</style>
# 多球體拋物運動實驗
這個實驗延續"拋物運動實驗"。
大家可以從Animation畫面上看到有十顆球,從左邊向右拋出。我們可以調整"Speed"旋鈕改變拋出的速度,也可以調整"Angle"旋鈕改變拋出角度。
不論是改變速度與角度,都會影響球掉落的位置。
## 自然小知識
* ### 角度(angle)與弧度(radian)
二相交直線或平面間之空間稱為角,而角度與弳度都是角的單位。角度是將一圓周分為360等分,單位符號為"°"。弧度又稱弳度,單位符號為rad。弧度與圓周率π有關,一個完整的圓的弧度是2π。單位弧度定義為圓弧長度等於半徑時的圓心角。角度與弧度可互相轉換,轉換公式如下:
> 1 弧度 = π / 180 * 角度
> 1 角度 = 180 / π * 弧度
>
* ### 三角函數(trigonometric functions)
一個直角三角形如下圖所示:
![](https://i.imgur.com/ZZpDZx1.png)
直角三角形的內角*θ* 和三個邊A、B與H的關系可以用三角函數:
> sin*θ* = A / H
> cos*θ* = B / H
> tan*θ* = A / B
> cot*θ* = B / A
> sec*θ* = H / B
> csc*θ* = H / A
>
三角函數在日常生活的應用十分廣泛,不論是在導航、測量、建築工程以及產品設計上,都會運用三角函數。
## 寫程式小知識
+ ### 函式(function)
在程式設計中,我們可以呼叫(call)函式來幫我們完成一些特定的工作。如此我們就不用費功夫去寫那項工作的程式了,只要呼叫一下,給幾個必要的參數即可。比如,三角函式,我們只要打入要執行的三角函式之名稱,然後在小括號內填上弧度值即可得到結果。像這樣:
```python3
x = Math.sin(3.14159) # x 即為sin(π)
y = Math.cos(3.14159 / 4.0) # y 即為cos(π / 4)
```
有些函式可以幫我們建立一個物件,像vec就可以幫我們建立一個三維的向量,只要呼叫vec並在小括號內依序填入x、y與z三個數值:
```python3
p = vec(1.0, 2.0, 3.0) # p 即為一個三維向量
```
有些函式可以幫某個物件計算特定的功能,像norm可以計算一個三維向量的長度,也就是x、y與z的平方和後再取平方根:
```python3
len = norm(p) # len 即為p的長度
```
我們可以把某個函式產生的結果,直接做為另一個函式的參數。如下面所式,將vec的結果直接給norm計算長度:
```python3
len = norm(vec(1.0, 2.0, 3.0)) # len 即為(1.0, 2.0, 3.0)的長度
```
+ ### 函式設計
我們可以設計一個屬於自己的函式!方法很簡單,格式如下:
```python3
def 函式名稱(參數名稱1, 參數名稱2, ...):
函式內容
```
其中,函式名稱與參數名稱都是可以自由地取名,但要符合變數名稱的取名規則(英文字母、數字與底線_的組合,第一個字不可是數字)。請注意,小括號後面有一個冒號,函式內容要縮排。
請點一下網頁上方的**Program**,然後看程式第14行:
```python3=14
def rad(x):
return Math.acos(-1)*x/180.0
```
這就是一個函式設計的範例,這個函式可用來將角度x轉成弧度。
請注意return 這個命令,它的意思是"**回傳**"。若函式會輸出一個結果,我們必須以return命令將計算結果輸出。否則,此函式將不會輸出任何東西。
## 寫程式能把理論化為現實
+ 點一下網頁上方的**Program**,就可以看到程式了。
+ 請看第25行:
```python3=25
ball.velocity = speed * norm(vec(Math.cos(rad(angle)), Math.sin(rad(angle)), 0))
```
以及第37行:
```python3=37
velocity = speed * norm(vec(Math.cos(rad(angle)), Math.sin(rad(angle)), 0)),
```
有沒有發現ball.velocity與velocity都等於一個同樣的運算式,大家可以把這個運算式包裝成一個名為getVelocity的函式嗎?讓getVelocity只要輸入一個角度值即可輸出一個運動向量。