# 水波節線、腹線
> 作者:王一哲
> 日期:2018/2/2
本次課程檔案已上傳至 GeoGebraTube,可以線上操作或下載檔案,網址為 https://ggbm.at/uSjh5KWT
<br />
<img height="100%" width="100%" src="https://lh5.googleusercontent.com/0Sd0hl2EU-EMtgCcQqEaadFjoao7ST_8NeBnUleg2aCN_5lt3rSbkcaJLo1WkibgfVl_lONgd-lG8b3Cws0jnji0LB-VEfoyMmGJnrdFENzWLB_mTwBSzjnwsIkRbiycyMY6ZAKT" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">L = 12、λ = 2 ~ 12 的節線、腹線位置</div>
<br />
## 繪圖步驟
1. 先在繪圖區上新增兩個點波源S<sub>1</sub>、S<sub>2</sub>的位置,選取工具列上的**新點**接著用滑鼠在繪圖區x軸上點左鍵兩下,或是直接用指令
```latex
S_1 = Point({-6, 0})
S_2 = Point({6, 0})
```
<br />
<img height="30%" width="30%" src="https://lh5.googleusercontent.com/DSlZuqlgymniRfO97qSq7yiIcvRgjcByny9ta2lrcbs20HlnDxSzJmjTAQXLU1OAhOO-NxoMPOirHWU45SPVb8LvEAZxAzvvzZ2smQ6YCbVEDEJdKCCORZFJ3xHIypYKSrJG0-HD" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">工具:新點</div>
<br />
2. 找到S<sub>1</sub>、S<sub>2</sub>的中點C,選取工具列上的**中心點**接著用滑鼠在S<sub>1</sub>、S<sub>2</sub>上各點左鍵一下,或是直接用指令
```latex
C = Midpoint(S_1, S_2)
```
<img height="30%" width="30%" src="https://lh4.googleusercontent.com/NZ-H40QXg-Ht7ZSqD-86FA15GQZCXQFN2-JG6HiXhzYByKHVnUepFBAroQBxQBNlaJRoZIp9zgtVHz3Lkun_PcFMd08UR5zFfVa7yObnncHEsV82msuv46yB6kyh_WrJhR12O6Qp" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">工具:中心點</div>
<br />
3. 畫出過C點且垂直於x軸的直線,選取工具列上的**垂直線**接著用滑鼠在C和x軸上各點左鍵一下,或是直接用指令
```latex
a = PerpendicularLine(C, xAxis)
```
<img height="30%" width="30%" src="https://lh3.googleusercontent.com/8IbPS-SDUokOKs6pOjrcEH4k4Sczopg8bHu39vRJ4uWOvE77APN2VVzCera4XFwtv93fwUpEgLdQNFUFa5qw_RtMnjXviatud-A7DxU2U-6JH-ti2raK1vO-zo_Xhhr9JN0Dq4sG" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">工具:垂直線</div>
<br />
4. 新增控制波長λ的數值滑桿,最小值2,最大值12,增量0.1,或是直接用指令
```latex
λ = Slider(2, 12, 0.1)
```
5. 定義S<sub>1</sub>、S<sub>2</sub>之間的距離,其中 abs 代表取絕對值,例如 abs(-1.9) = 1.9。x(S_2)代表讀取S_2的x座標值。
```latex
len = abs(x(S_2) - x(S_1))
```
6. 定義腹點數量 n_a,其中 floor 代表無條件捨去,例如 floor(1.9) = 1。
```latex
n_a = floor(len / λ)*2 + 1
```
7. 定義節點數量 n_n,其中 round 代表4捨5入,例如 round(1.5) = 2。
```latex
n_n = round(len / λ)*2
```
8. 定義x方向單位向量u並設定為不顯示,這是等一下要畫射線用的,先設定好比較方便。
```latex
u = Vector((0, 0), (1, 0))
```
上式指令格式為
```latex
Vector(起點座標, 終點座標)。
```
9. 畫出右半邊的腹點
```latex
antinode = Sequence(Point({x(C) + λ/2*i, y(C)}), i, 0, (n_a - 1) / 2, 1)
```
上式指令格式為
```latex
Sequence(含有變數i的表達式, i, i的初值, i的末值, 增量)
```
增量的預設值為1,可以省略。這在這用的表達式為
```latex
Point({x(C) + λ/2*i, y(C)})
```
意思是在 (C點 x 座標 + i 個半波長, C點 y 座標)處畫點。i的末值為 (n_a - 1) / 2 是為了扣掉中央腹點後再除以2。
10. 畫出左半邊的腹點,由於圖形左右對稱,可以用鏡射的方式偷懶,選取工具列上的**線對稱**,接著用滑鼠在右半邊的腹點和直線a上各點左鍵一下,或是直接用指令
```latex
antinode' = Reflect(antinode, a)
```
上式指令格式為
```latex
Reflect(物件名稱, 對稱線名稱)
```
<img height="30%" width="30%" src="https://lh4.googleusercontent.com/gqA7nQkq4y4NN1Ka39oGHXrOTQfakS8NUkmXuEeT0DtBPnGQvxCiLYlOHnIro5oyTqApCpY-FgbOXIgxVx6m5py5enJuKvOu651G50LZ66ROx7Awz4fuoScZPO4ta5AABB938mKX" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">工具:線對稱</div>
<br />
11. 畫出大部分的腹線
```latex
antinodeline = If(x(antinode((n_a + 1) / 2)) != x(S_2),
Sequence(Hyperbola(S_1, S_2, antinode(i)), i, 1, (n_a + 1) / 2, 1),
Sequence(Hyperbola(S_1, S_2, antinode(i)), i, 1, (n_a - 1) / 2, 1))
```
這應該是整個過程當中最麻煩的一個步驟,If 當中的條件是用來檢驗波源上是否正好為腹點,如果不是的話就將所有的腹線都畫出來,如果是的話不畫出最後一組腹線。會這麼麻煩是因為當波源上正好是腹點時,會有一條腹線是以波源為起點、向外延伸的射線。如果只用
```latex
Sequence(Hyperbola(S_1, S_2, antinode(i)), i, 1, (n_a + 1) / 2, 1)
```
當波源上正好是腹點時圖形會變為下圖。還有用到繪製雙曲線的指令,格式為
```latex
Hyperbola(焦點1, 焦點2, 除了焦點外任一點)
```
我們用 Sequence 將 antinode 串列裡的腹點依序代入,由於雙曲線左右對稱,所以只要代入右側的腹點即可。
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/SRbEeXP-zi7XA1GXd1kHRSm85zdAvnCcdusNkR5UjmR_KbtOcMeJdU9IVZQeeuy8O6Zdx64nlshURST1Hq7qq7lGJiBaXTi-N5Z4oq6jwtZPnSGHhThSKWKBiDq1jdLjmlSeHEZu" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">效果較差的腹線</div>
<br />
12. 畫出波源上的腹線
```latex
r_a = If(x(antinode((n_a + 1) / 2)) == x(S_2), Ray(S_2, u))
```
當波源上有腹點時才畫。另外用到繪製射線的指令,格式為 Ray(起點, 射線方向的向量)。再用線對稱畫出另一邊的腹線
```latex
r_a' = Reflect(r_a, a)
```
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/5AwBc0FhiAmTEKMvGxutJx2jaxuWKKwzxm74qtBJuGlx62z0OPqldn3bqhk7xossCZKOmdQZTkOO9e96EARXkua5L5BNVoZsSN4094nS9scjy36xCXAxbhm7cMuqSQJ1wR33IejD" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">效果較好的腹線</div>
<br />
13. 畫出大部分的節線
```latex
nodeline = If(x(node(n_n / 2)) != x(S_2),
Sequence(Hyperbola(S_1, S_2, node(i)), i, 1, n_n / 2, 1),
Sequence(Hyperbola(S_1, S_2, node(i)), i, 1, n_n / 2 - 1, 1))
```
14. 畫出波源上的節線
```latex
r_n = If(x(node(n_n / 2)) == x(S_2), Ray(S_2, u))
r_n' = Reflect(r_n, a)
```
<img height="100%" width="100%" src="https://lh3.googleusercontent.com/6ox5J6t2BYtOsmM2QUl9vHEcHKaCBqsQT1FDJi5PVV97UqrbCX2Z6iIukH-iDBoQqfB3pVyUrva22CxqO-CKscvFlv72w5W0btpGj2sgdfVeOR-J4dXvk8X5yv9EsKerkygcG-KS" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">效果較好的節線</div>
<br />
15. 畫出波峰波前
```latex
crest = Sequence(Circle(S_1, λ*i), i, 1, n_n)
crest’ = Sequence(Circle(S_2, λ*i), i, 1, n_n)
```
16. 畫出波谷波前
```latex
trough = Sequence(Circle(S_1, λ*(i - 0.5)), i, 1, n_n)
trough’ = Sequence(Circle(S_2, λ*(i - 0.5)), i, 1, n_n)
```
17. 新增控制是否顯示波前的核取方塊
```latex
front = Checkbox({crest, crest’, trough, trough’})
```
核取方塊的指令格式為
```latex
Check({物件1, 物件2, …})
```
其實 Checkbox 代表布林值,打鈎時為 true 顯示物件,沒打鈎時為 false 隱藏物件。
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/NgeT2qQ-hWmgnJrjuyNlnClktxfMBhv6C9dZAkvH5QUDPkXbgnhHhkKwf-CnAVGGiv4ufHmdzbWxkIoWyAmpGsyyd0K1Y3BsN24QFN8ozHcywwM0whBqoMQolFVFSD2hF-wFB-w7" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">同相位干涉範例(顯示波前)</div>
<br />
<img height="100%" width="100%" src="https://lh5.googleusercontent.com/xq7waa6OBgSL4ApDWlNz3Fj-yUrpOzxMRKeZNLgViU-XALKs9DmlZbiacSm3BWLKjPJ5-nFaivYljKewzAvy28Huz5MnTYaakLgS2rwqg_ZsfvNW8W5fZ8weST3qLOgmFvf6BtjQ" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">同相位干涉範例(不顯示波前)</div>
<br />
## 結論
雖然使用工具列及滑鼠就能畫出許多有用的圖,雖然用指令繪圖比較麻煩,但是有一些效果只有用指令才能做到,值得花時間學習指令的用法。另外還有一個必須克服的麻煩,就是在搜尋資料時通常英文的資料遠比中文的資料還多,尤其是像這類由國外開發的軟體更是如此。感謝各位能夠看到最後。
<br />
## 相關指令的官方說明書
1. 點 https://wiki.geogebra.org/en/Point_Command
2. 中心點 https://wiki.geogebra.org/en/Midpoint_Command
3. 垂直線 https://wiki.geogebra.org/en/PerpendicularLine
4. 數值滑桿 https://wiki.geogebra.org/en/Slider_Command
5. 向量 https://wiki.geogebra.org/en/Vector_Command
6. 線對稱 https://wiki.geogebra.org/en/Reflect_Command
7. 串列 https://wiki.geogebra.org/en/Sequence_Command
8. 雙曲線 https://wiki.geogebra.org/en/Hyperbola_Command
9. 核取方塊 https://wiki.geogebra.org/en/Checkbox_Command
<br />
---
###### tags:`GeoGebra`