# 球面像差
> 作者:王一哲
> 日期:2018/2/13
用球面作成的凹面鏡無法將平行主軸的入射光集中在同一個點,如果想要讓球面鏡有接近抛物面鏡的效果,入射光必須靠近主軸,球面的曲率半徑要夠大。本次課程檔案已上傳至 GeoGebraTube,可以線上操作或下載檔案
1. 球 https://ggbm.at/TEJPHsya
2. 抛物線 https://ggbm.at/d2khJ7t2
<img height="100%" width="100%" src="https://lh4.googleusercontent.com/IopSFrSqw9divixCuK3oho9ez-dCvN362J7CB7oL86OnPYMJl-51kYY8jckf11k_HllnwEAdk5AIRGx7LGTaHxHwKn3EFr5xTnQ0tbdxuJ22T5BvbhHTlO2OnAMv9V1Y0aPucIt6" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差最終成果</div>
</br>
## 球面像差繪圖步驟
1. 新增控制入射光數量 n、半徑 r、入射光範圍 range 的數值滑桿,指令為
```latex
n = Slider(1, 11, 1)
r = Slider(5, 15, 1)
range = Slider(0, r-1, 0.1)
```
為了不讓入射光照到球面鏡的邊緣,因此 range 的最大值設為 r-1。手動調整數值 n = 5、r = 10、range = 5。
2. 在 x 軸上新增原心點 C,利用 Segment 指令,以點 C 為起點向右畫出長度為 r 的線段,線段的右端會自動新增一個點,將它重新命名為 A,再用 Rotate 指令畫出點 C 上、下距離皆為 r 的點 A1、A2,再畫出通過 A1、A2 的圓弧 c。指令為
```latex
C = Point(xAxis)
i = Segment(C, r)
A_1 = Rotate(A, 90°, C)
A_2 = Rotate(A, -90°, C)
c = Semicircle(A_1, A_2)
```
<img height="100%" width="100%" src="https://lh3.googleusercontent.com/BR7XSigJzWXTN8rl-_LA8jgVzlCchwtD4CYLefLAKPHxqiQndjFaAiTKj1aV8O8sbVMYcYqK2lQAsPCElsdYPKzcWFi8YALSlvaL4Nl-C5ASst0wxKzCsTuAbv4k5Kka0t6tG1jl" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差步驟 1 ~ 2 成果</div>
</br>
3. 在 x 軸上畫出直線 f 作為主軸,新增點 B,在點 B 上、下 ± range 的範圍內畫 n 個點 points ,由這 n 個點畫出平行主軸的直線 lines ,找出直線與圓弧的交點 inters。指令為
```latex
f = Line(A, C)
B = Point(xAxis)
points = Sequence((x(B), i), i, -range, range, 2*range / (n - 1))
lines = Sequence(Line(points(i), f), i, 1, n)
inters = Sequence(Intersect(c, lines(i)), i, 1, n)
```
<img height="100%" width="100%" src="https://lh3.googleusercontent.com/SAy4CtCh-B1G55Bw49IHsLf1VCdDc2ojyNnztWIg4xyF3VDboWmimOwuzhgvmfZT3Xf5JwO107LHgLetP6-KfHCW0GvhldGjdsov_Ki5WEHlnaReUg-Ch6bKn97D2YKMbBNodwAF" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差步驟 3 成果</div>
</br>
4. 畫出圓弧上的點 inters 各自的切線 tangents 與法線 nomrs。如果想要偷懶一點就只畫圓心和圓弧上各點的連線,這些連線就會是法線,這是圓的特性。
```latex
tangents = Sequence(Tangent(inters(i), c), i, 1, n)
nomrs = Sequence(PerpendicularLine(inters(i), tangents(i)), i, 1, n)
```
<img height="100%" width="100%" src="https://lh5.googleusercontent.com/ksBwOiRzaKQdaVytKG-v6NtLzpYWOhKcfA-DVHBOCReitAJZ1j0_PYkckPua82acODYDRnCq8DWTeSICIGsulhBWYE87bimxlYgYRCqmVkEmL5OICipnXO4z7g7ht7CatqGMgFWm" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差步驟 4 成果</div>
</br>
5. 用 inters 及 points 畫出射線 incidents 作為入射光,再用線對稱畫出 points 反射後的點 points’,再用 inters 及 points' 畫出射線 reflects 作為反射光。
```latex
incidents = Sequence(Ray(inters(i), points(i)), i, 1, n)
points' = Sequence(Reflect(points(i), norms(i)), i, 1, n)
reflects = Sequence(Ray(inters(i), points'(i)), i, 1, n)
```
這裡我們不直接畫 incidents 的線對稱,因為畫出來會像下方的第二張圖,線對稱的結果會變成直線,不符合我們的需求。
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/jvSMRAASfTMjMJAIB8W9jHEcHR9dUjsY1LTZvIGkqbCMCJDloFFP3hAQIZQ05KZxlbd12YNDfY0MpJc4nKweUPkHJ6numOoiHDIOpwbUnWP_5y3XmH3FPf-n7uyeyJZeDIulMcPr" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差步驟 5 成果</div>
</br>
<img height="100%" width="100%" src="https://lh4.googleusercontent.com/fSzab8_MD1mcMc6ax26r6KfycX6YUkJGwiTJPGCDtBOp2Wd4QHfFCbSWPC6w4zOJnt6vWLFVPoW6-5rkGxUKYHA5gkp-LM4_CTDiZYw3vY6IAbei9x0vIp_JXha0FURTjp6qiqy2" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差步驟 5 對入射光直接畫線對稱的結果</div>
</br>
6. 調整不同的入射光範圍 range,當 r = 10、range = 6.4 時,反射光很明顯地沒有集中在一個點上;當 r = 10、range = 3 時,反射光幾乎集中在 x = 5 處,可以看出焦距 f 約等於 r/2。
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/pONPO_QYIiGu3Ziu_H71W1KRsby8haWMwwT06q6DL9U0JZidn-I7i3xB-fTpoklHaJTnnXf0QbwMRN5jj7zTH3P7bK8-4mJcTpgNo42IJwVHZmujSRGTM_M2xTS2QWDaZBNDV4Jd" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差 r = 10、range = 6.4 的圖形</div>
</br>
<img height="100%" width="100%" src="https://lh5.googleusercontent.com/ppB--He5UQyaP_e3dad5lTk6pSZjlkLgC2sYeSn4rAbzKBSpQzurT_446AQRG9-qcAEuK-W1X1QcYDXDyU3o7sRjmFLRzKxfnONtIe5rkJP_QuJ84Vq7PKsjQBOPVC18BwAGdVND" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">球面像差 r = 10、range = 3 的圖形</div>
</br>
## 抛物線反射繪圖步驟
1. 請參考前一篇文章〈[二次曲線光學性質](https://hackmd.io/s/HkdOLDVFE)〉抛物線繪圖步驟1、2畫出如下圖的抛物線。
<img height="80%" width="80%" src="https://lh4.googleusercontent.com/pGbvcjA1UNoKrw14rq0N_Ctnrj2AIzcDUh5-j5YfKme6rq5foQIutxDFzs6FET1A9-89KMHr83uSEwktjvSkQ-MWkAbotcWyfjA1-rhNfA9P3-R8nXDIfh_XCS-6Y0p1SSEi1qED" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射步驟 1 成果</div>
</br>
2. 新增控制入射光數量 n、入射光範圍 range 的數值滑桿,指令為
```latex
n = Slider(1, 11, 1)
range = Slider(1, 10, 0.1)
```
手動調整數值為 n = 5、range = 10。
3. 在 x 軸上畫出直線 f 作為主軸,新增點 B,在點 B 上、下 ± range 的範圍內畫 n 個點 points ,由這 n 個點畫出平行主軸的直線 lines ,找出直線與抛物線 d 的交點 inters。指令為
```latex
f = Line(A, C)
B = Point(xAxis)
points = Sequence((x(B), i), i, -range, range, 2*range / (n - 1))
lines = Sequence(Line(points(i), f), i, 1, n)
inters = Sequence(Intersect(d, lines(i)), i, 1, n)
```
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/gZqgWSCxFeWfiozVhpbcT6VgDUlQHCOnfvs5EPOGqiYIaNSn58erKRcAtJut3uwxswStoAmn6UtgJvR7_YdspxrNllej4swUCpQh1dBQ7DYcrthS13qd72ZjRFyTSgjbRjiCE5yQ" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射步驟 2 ~ 3 成果</div>
</br>
4. 畫出圓弧上的點 inters 各自的切線 tangents 與法線 nomrs。
```latex
tangents = Sequence(Tangent(inters(i), d), i, 1, n)
nomrs = Sequence(PerpendicularLine(inters(i), tangents(i)), i, 1, n)
```
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/5IaaV06AsFWsZ4KWe9xfuRFBbM39pf5oRf9njBM9yzrWq5RJ7tizE8epa3CHKZNyBcMIDaPP5QcQcufXruzuD5c6aYK7FRFFDTtUpF7F33YEHOYylKFmcGNqkRT52BVUm4Hvk-nj" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射步驟 4 成果</div>
</br>
5. 用 inters 及 points 畫出射線 incidents 作為入射光,再用線對稱畫出 points 反射後的點 points’,再用 inters 及 points' 畫出射線 reflects 作為反射光。
```latex
incidents = Sequence(Ray(inters(i), points(i)), i, 1, n)
points' = Sequence(Reflect(points(i), norms(i)), i, 1, n)
reflects = Sequence(Ray(inters(i), points'(i)), i, 1, n)
```
<img height="100%" width="100%" src="https://lh6.googleusercontent.com/wBdfXHoiQta_zhoX0De6ptDzFthNVZwhhq3BDv2TpGsS6jylnfehm68NbvxuRwjUqOeMQXHHxUAyH6RUo_v5DMr3BogIwASn8jAxE_3k2-qIunlxGyOhTwULcPN6CLhyIOIhpt5-" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射步驟 5 成果</div>
</br>
6. 調整不同的入射光範圍 range,可以看到不管入射光範圍有多大,反射光依然會經過焦點。
<img height="100%" width="100%" src="https://lh5.googleusercontent.com/GSRgxnz2vdMkL8v1fUFuhsvuDhWjqJVKkzbmU_9Kip0AYHszU33l5YtQOUYcEuwNJgFjboT9LEetWVQkwrvLTHeIbCmot32Z74wWpToyeZ9NBEzW3Lec9Dii-4JF60kx29wnWpxC" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射 range = 3 的圖形</div>
</br>
<img height="100%" width="100%" src="https://lh4.googleusercontent.com/zzpUqXJaXyBdIlBuj3S31O7uucz2sfDWoTieqkFSQlp0IqwpWteccJTIUBb-pe0jkMROrjPOzVvynlLrafsZmpHSf2l2hiVxqcIbPprce3WoLcnsviwPOmisgFsHbuUbJeN4kMDh" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">抛物線反射 range = 10 的圖形</div>
</br>
## 相關指令的官方說明書
1. 數值滑桿 https://wiki.geogebra.org/en/Slider_Command
2. 點 https://wiki.geogebra.org/en/Point_Command
3. 線段 https://wiki.geogebra.org/en/Segment_Command
4. 半圓 https://wiki.geogebra.org/en/Semicircle_Command
5. 直線 https://wiki.geogebra.org/en/Line_Command
6. 串列 https://wiki.geogebra.org/en/Sequence_Command
7. 切線 https://wiki.geogebra.org/en/Tangent_Command
8. 垂直線 https://wiki.geogebra.org/en/PerpendicularLine_Command
9. 射線 https://wiki.geogebra.org/en/Ray_Command
10. 線對稱 https://wiki.geogebra.org/en/Reflect_Command
11. 抛物線 https://wiki.geogebra.org/en/Parabola_Command
</br>
---
###### tags:`GeoGebra`