02 拋物線上的光線反射(多次)
與前次不同之處
1. 對稱點的選擇
與之前不同,之後為了找到反射方向所做出的對稱點,會用略微不同的方式製作,以避免光線往拋物線外面射出。
2. 射線的設置
之前所做出的射線,會與拋物線有兩個交點,一個是原本的反射點,另一個是下一個反射點。這裡會用一個小小技巧,讓射線與拋物線只有一個交點(下一個反射點)。
3. 起始光線平行對稱軸或經過焦點
此時光線經過1~2次反射之後,就會往無限遠處射出,也就是說不會有下一個反射點了,也不會有用來模擬光線的向量。此時就要再用其他方式,將這樣的光線製造出來。
在此處製作 拋物線上的光線反射(多次)
步驟1 製作拋物線
在指令列輸入指令:y = 0.25*x^2
(此拋物線的焦點會位於(0,1) )
步驟2 製作光源起點A,以及最初的反射點B
.確認一下拋物線的名稱是否為f,以下以拋物線名稱為f為例去操作
(1) 在拋物線內製造一新點A(A點必須要在拋物線的上方)
(2) 在拋物線上製造一點B。
(3) 製作向量AB,作為光線的示意。
步驟3 製作拋物線在B點上的法線
.相較於切線,實際上更重要的是法線。
.這裡就不再另外製造出切線,而是將切線放入雙重指令。
.製作法線:輸入指令PerpendicularLine(B, Tangent(B, f) ),得到直線g。
步驟4 製作反射光線
(1) 做點A對法線g的對稱點A',可用線對稱工具或者指令Reflect(A, g)。
(2) 做出射線,輸入指令Ray( 0.99*B+0.01*A' , A' ),並將其重新命名為r1。
(3) 做出射線r1與拋物線f的交點,得到C點。
(4) 製作向量BC,作為光線的示意。
步驟5 製作下一個反射點
(1) 製作法線:輸入指令PerpendicularLine(C, Tangent(C, f) ),得到直線h。
(2) 利用前一個反射點,做點B對法線h的對稱點B',或者指令Reflect(B, h)。
(3) 做出射線,輸入指令Ray( 0.99*C+0.01*B' , B' ),並將其重新命名為r2。
(4) 做出射線r2與拋物線f的交點,得到D點。
(5) 製作向量CD,作為光線的示意。
步驟6 重複步驟5,直到做出足夠的反射點
.當光線不是平行對稱軸或者經過焦點時,光線會在拋物線上反射無限次。
.大多時候光線反射幾次後,就會跑到很遠的地方。所以只要做4~6次的反射,就足以應付大多數的情況了。
步驟7 調整特殊情形的射線顯示,並隱藏不必要物件
(1) 當起始光源A到B之間會通過焦點時,光線反射一次後會遠離拋物線,所以要讓射線r1顯示。
將射線r1的顯示條件設定為「 x(B) == x(A') 」,同時製造向量BA',讓射線r1看起來更有方向感,並使該向量的顯示條件亦設為「 x(B) == x(A') 」。
(2) 當起始光源A到B的方向平行對稱軸時,光線反射兩次後會遠離拋物線,所以要讓射線r2顯示。將射線r2的顯示條件設定為「 x(C) == x(B') 」,同時製造向量CB',讓射線r2看起來更有方向感,並使該向量的顯示條件亦設為「 x(C) == x(B') 」。
(3) 隱藏不必要出現的法線、射線和對稱點。