球面像差
日期:2018/2/13
用球面作成的凹面鏡無法將平行主軸的入射光集中在同一個點,如果想要讓球面鏡有接近抛物面鏡的效果,入射光必須靠近主軸,球面的曲率半徑要夠大。我的目標是畫出可以自己調整半徑、入射光範圍、入射光數量的圖,另外也用同樣的方式畫出抛物線版本的圖。GeoGebraTube 的連結在此:1. 球https://ggbm.at/TEJPHsya 2. 抛物線 https://ggbm.at/d2khJ7t2
球面像差繪圖步驟
1. 新增控制入射光數量 n、半徑 r、入射光範圍 range 的數值滑桿,指令為
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。指令為
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)
球面像差步驟 1 ~ 2 成果
3. 在 x 軸上畫出直線 f 作為主軸,新增點 B,在點 B 上、下 ± range 的範圍內畫 n 個點 points ,由這 n 個點畫出平行主軸的直線 lines ,找出直線與圓弧的交點 inters。指令為
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)
球面像差步驟 3 成果
4. 畫出圓弧上的點 inters 各自的切線 tangents 與法線 nomrs。如果想要偷懶一點就只畫圓心和圓弧上各點的連線,這些連線就會是法線,這是圓的特性。
tangents = Sequence(Tangent(inters(i), c), i, 1, n)
nomrs = Sequence(PerpendicularLine(inters(i), tangents(i)), i, 1, n)
球面像差步驟 4 成果
5. 用 inters 及 points 畫出射線 incidents 作為入射光,再用線對稱畫出 points 反射後的點 points’,再用 inters 及 points' 畫出射線 reflects 作為反射光。
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 的線對稱,因為畫出來會像下方的第二張圖,線對稱的結果會變成直線,不符合我們的需求。
球面像差步驟 5 成果
球面像差步驟 5 對入射光直接畫線對稱的結果
6. 調整不同的入射光範圍 range,當 r = 10、range = 6.4 時,反射光很明顯地沒有集中在一個點上;當 r = 10、range = 3 時,反射光幾乎集中在 x = 5 處,可以看出焦距 f 約等於 r/2。
球面像差 r = 10、range = 6.4 的圖形
球面像差 r = 10、range = 3 的圖形
抛物線反射繪圖步驟
抛物線反射步驟 1 成果
2. 新增控制入射光數量 n、入射光範圍 range 的數值滑桿,指令為
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。指令為
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)
抛物線反射步驟 2 ~ 3 成果
4. 畫出圓弧上的點 inters 各自的切線 tangents 與法線 nomrs。
tangents = Sequence(Tangent(inters(i), d), i, 1, n)
nomrs = Sequence(PerpendicularLine(inters(i), tangents(i)), i, 1, n)
抛物線反射步驟 4 成果
5. 用 inters 及 points 畫出射線 incidents 作為入射光,再用線對稱畫出 points 反射後的點 points’,再用 inters 及 points' 畫出射線 reflects 作為反射光。
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)
抛物線反射步驟 5 成果
6. 調整不同的入射光範圍 range,可以看到不管入射光範圍有多大,反射光依然會經過焦點。
抛物線反射 range = 3 的圖形
抛物線反射 range = 10 的圖形
結論
這兩張圖後半段的繪圖步驟幾乎一模一樣,只要掌握繪圖的原則,就可以畫出更多自己想要的效果。雖然可以調整入射光的數量,但是當入射光數量太多時,圖形會亂到很難看清楚,效果反而不好。
相關指令的官方說明書
- 數值滑桿 https://wiki.geogebra.org/en/Slider_Command
- 點 https://wiki.geogebra.org/en/Point_Command
- 線段 https://wiki.geogebra.org/en/Segment_Command
- 半圓 https://wiki.geogebra.org/en/Semicircle_Command
- 直線 https://wiki.geogebra.org/en/Line_Command
- 串列 https://wiki.geogebra.org/en/Sequence_Command
- 切線 https://wiki.geogebra.org/en/Tangent_Command
- 垂直線 https://wiki.geogebra.org/en/PerpendicularLine_Command
- 射線 https://wiki.geogebra.org/en/Ray_Command
- 線對稱 https://wiki.geogebra.org/en/Reflect_Command
- 抛物線 https://wiki.geogebra.org/en/Parabola_Command
沒有留言:
張貼留言