簡介
上週補習班開始教「平面方程式」,有一題範例感覺特別的酷,題目如下:
空間坐標系中,有一平面鏡E,一雷射光線經過點$A(1,-1,2)$射向鏡面E上的點$B(0,1,0)$,反射又經過點$C(4,-3,2)$,試求平面E的方程式為何?
解法大概就是利用菱形對角線平分的概念求出平面方程式!由這一題延伸,我想看看當改變已知平面的各項參數時,反射光的向量會有怎麼樣的變化,於是就嘗試用VPython模擬出來!
反射定律及數學
平面的情況很好理解,入射角等於反射角,但當來到三維時,除了角度一樣之外,這三個向量還必須在同一個平面上:
原題我們是利用已知的$\overrightarrow{BA},\overrightarrow{BC}$,利用菱形邊長相等且平分夾角的性質,將長度調整成一樣之後相加即可求出平面的法向量,進一步求得反射的平面:
要利用$\overrightarrow{BA}$以及平面方程式逆推反射光向量,在確認法向量的方向向量之後,將平面法向量的長度設為$|\vec{n}| = 2\overline{AB}\cos\theta$,由$\vec n = \overrightarrow{BA}+\overrightarrow{BC}$即可推得與$\overrightarrow{BA}$長度相同的$\overrightarrow{BC}$!
綜合以上,令反射平面方程式為$ax+by+cz = 0$,$\vec n = (a,b,c)$,入射角為$\theta$,則:
模擬及程式碼
使用說明
模擬連結
他會要求輸入發射源的$x,y,z$座標,完成後可以利用鍵盤’A,S’鍵調整平面$ax+by+cz=0$上$a$的大小(A變大、S變小),$b$則是’B,N’鍵、$c$是’C,V’鍵。
利用以上的公式,我們建立各個物件、包含各個座標軸、反射平面以及入射反射光。模擬中兩個黃色的箭頭代表入射光及反射光的向量,灰色箭頭則是平面的法向量。
計算
計算夾角用到內積算夾角的餘弦$\cos\theta = \frac{\vec a\cdot\vec b}{|\vec a||\vec b|}$,算內積函式如下:
1 | def dt(a,b): |
接著就是計算$|\vec n|$的長度sz,對$\vec n$取單位向量後乘上長度,並設為平面的法向量,將$\vec n$與入射光向量相減得到反射光向量
1 | sz = 2 * mag(ball.pos) * dt(plane.up,ball.pos) / (mag(plane.up)*mag(ball.pos)) |
完整程式碼
1 | GlowScript 3.2 VPython |
延伸內容
既然有反射勢必有折射定律的模擬,牽扯到不同介質的折射率以及角度的計算$n_1\sin\theta_1 = n_2\sin\theta_2$,之後可以嘗試寫一個模擬試試!