2020年7月10日金曜日

楕円接線《入射角・反射角》定理の説明図

 光の入射角と反射角は一致するので、楕円では、焦点から発射された光が接線で反射したら、もういっぽうの焦点に向かって進路を変更することが知られています。
 この現象を数学の定理として紹介した参考書があります。その内容を引用したあとで、説明図の作図を試みます。

『曲線』幾何学の小径
1.1.3 楕円の接線
 (pp.3-4)
 平面の 2 つの定点 A, B と正の実数 c に対して、AP + BP = c の軌跡として表される楕円を E とします。このとき次の命題は明らかなことでしよう:
 命題 1.1 点 Q が楕円 E の外側にあるならば AQ + BQ > c であり、楕円の内側にあるならば AQ + BQ < c である。
 さて、A, B を焦点とする楕円 E 上に点 P をとり、P における E の接線 L をひきます。このとき、
 定理 1.2 線分 AP L のなす角と線分 BP L のなす角は等しい。
 [証明] 接線 L 上のかってな点 Q を考えます。Q が接点 P でない限り Q は楕円 E の外にあります(このあたりまえのことが重要)。命題 1.1 により、不等式
AQ + BQ ≧ c
が成り立ちます。特に等号 AQ + BQ = c が成り立つのは Q が接点 P のところにあるときだけです。
 接線 L に対して A と対称の位置にある点をとします。このとき、AQ = A´Q です。したがって、
A´Q + BQ ≧ c
が成り立ち、Q = P のとき等号が成り立ちます。これはから Q を経由して B に至る折れ線の長さは c 以上で、Q = P のとき c に等しいことをいっています。つまり、から B に至る折れ線の長さは、P を通るときに最小になります。したがって、3 A´, P, B 1 直線上にあり、よって問題となる角度が等しいことがわかります。
〔小沢哲也/著『曲線』2005年9月7日 培風館/発行〕

◎ 上記資料に掲載されている、参考図のイメージを次に示します。
◈   AP = A´P  ,   AQ = A´Q
 ▸ 楕円の長径(長軸)を 2a 、短径(短軸)を 2b とします。
 ▸ 焦点 A, B x 座標をw, w とし、y 座標を 0 とします。
 ▸ 点 P x, y 座標を px, py とし、点 Q x, y 座標を qx, qy とします。
 ▸ 接線 L の傾きを m とし、接線の y 切片を d とします。
 ▸ 接線に垂直な直線の傾きを n とし、その y 切片を e とします。
⛞ 作図のための計算方法
▶ w = Math.sqrt(a*a - b*b);
▸ t = 110 / 180 * Math.PI;
▶ px = a * Math.cos(t);
▶ py = b * Math.sin(t);
▶ m = -b*b*px / (a*a*py);
▶ d = py - (m*px);
▶ n = a*a*py / (b*b*px);
▶ e = w*n;
 ▸ qx の値を 35 としました。
▶ qy = m*qx + d;
 ▸ 点 A から接線に下した垂線の足を H とし、その座標を hx, hy とします。
 ▣ 連立方程式の解を求めることで、直線 HA と接線 L との交点の座標は計算できます。
y = n xe
y = m xd
 ● n xe = m xd
 ∴ (nm) x = de
▶ hx = (d - e) / (n - m);
▶ hy = n*hx + e;
 ▸ 直線 PB の傾き pb y 切片の値 pd
▶ pb = -py / (w - px);
▶ pd = -w*pb;
 ▣ 連立方程式の解を求めることで、直線 HA と直線 PB の交点の座標は計算できます。
y = n xe
y = pb xpd
 ● n xe = pb xpd
 ∴ (npb) x = pde
▶ x = (pd - e) / (n - pb);
 ▣ 楕円を描く構文は、次のように記述しています。
 <SCRIPT>
 var cvs = document.getElementById('ellipse_canvas');
 var pen = cvs.getContext('2d');
 var a = 200;
 var b = 120;
   // ペン軸を移動
   pen.translate(280, 150);
   // 楕円
   pen.strokeStyle = 'royalblue';
   pen.lineWidth = 2;
   pen.beginPath();
   pen.moveTo(a, 0);
   for(var i=1; i<360; i++) {
      pen.lineTo(a * Math.cos(i / 180 * Math.PI), b * Math.sin(i / 180 * Math.PI));
   }
   pen.closePath();
   pen.stroke();
 </SCRIPT>

 今回も JavaScript によるプログラムの全文を、このページ内に同梱しています。

0 件のコメント:

コメントを投稿