鏡の仕組みを不思議に思ったことはありませんか?光が表面で反射する際の軌跡を知りたい場合は、フェルマーの原理を使うことができます。これは次のようなものです。
光が進む道は、最も時間がかからない道です。A地点からB地点へ移動する際、光は他のどの選択肢よりも時間がかからない道を選びます。
実際、私は変分原理を学ぶ生徒たちにフェルマーの原理を使った質問でこの考え方を使いました。それは次のようなものです。
下に2つの点(AとB)があります。光はAから進み、底面で反射してB点に到達します。最短時間の経路において、入射角と反射角が等しいことを示してください。

物理学専攻の学生にとって理想的な解決策は、光がA地点からB地点まで移動するのにかかる時間を表す関数を設定することです。この関数は、光が表面に当たる位置(つまり入射角と反射角)に依存します。位置の関数として時間が得られれば、微積分を用いて関数を最小化することができます。
でも、その通りにやるつもりはありません。私は色々なことを混ぜるのが好きなので、この問題を数値的に解くのはどうでしょうか?「数値的」というのは、A地点からB地点への光の動きをモデル化するPythonプログラムを作るということです。そして、表面上の反射点を変えて、移動時間が最短になるようにします。きっと楽しいでしょう。
基本的なプログラムから始めましょう。このプログラムは、2つの点(AとB)と、非常に低速で移動する光線(つまり、目で確認できる速度)から始まり、光線の先端は表面の特定の点に向けられます。この点は変更できます。光線の先端がこの点に到達すると、方向を変えて点Bに向かいます。光線が点Bに到達すると、全体が停止し、合計時間を報告します。これで完了です。プログラムはこちらです(「再生」ボタンを押して実行してください)。
上の出力ウィンドウを下にスクロールすると、角度と時間を確認できます。光が当たる表面上の点の位置は手動で変更できますが、そのままにしておくと、入射角16.699°、反射角67.380°で、光は2.37秒かかります。
もちろん、表面上の反射点を手動で変更したくはありません。面倒くさくて。代わりに、プログラムを変更して、ある地点に光を照射し、その点を少しだけ前方に移動させます。この動作を、点が終点のすぐ下になるまで繰り返し、入射角と合計時間をプロットできるようにします。
結果は以下の通りです。確かに少し複雑ですが、念のためコメントも入れておきました(繰り返しますが、「再生」ボタンを押して実行してください)。
光の時間と入射角、反射角を出力しましたが、少し見づらいです。同じプログラムで時間と角度の関係をプロットしたものがこちらです(位置の変化も小さくしています)。

このグラフから、入射角と反射角が等しいとき、最も時間が短い角度であることがわかります(曲線が粗く見えるのは、角度の計算方法によるものだと思います)。さあ、反射の法則が完成です。点Bの位置を変えて、どうなるか見てみましょう。それでもうまくいくはずです。
さて、宿題です。この式を使ってスネルの法則を再現できるか試してみてください。スネルの法則は、光が一つの媒質から別の媒質(空気から水など)へ進むとき、その媒質における見かけの光速に応じて光の進路が変化するというものです。入射角と反射角は次の式で表されます。

この式において、n 1と n 2 はそれぞれ屈折率です。これは、真空中の光速(一定)とその物質中の見かけの光速の比です。したがって、これを数値計算にすると、光線は依然として動いていることになります。しかし、2番目の物質に入ると、光速はいくらか低下します。光速は一定ではないため、最短時間経路は完全な直線にはなりません。信じてください、これは楽しいことだと思います。