この現象を数学の定理として紹介した参考書があります。その内容を引用したあとで、説明図の作図を試みます。
『曲線』幾何学の小径
1.1.3 楕円の接線
(pp.3-4)
平面の 2 つの定点 A, B と正の実数 c に対して、命題 1.1 点 Q が楕円 E の外側にあるならば
さて、A, B を焦点とする楕円 E 上に点 P をとり、P における E の接線 L をひきます。このとき、
定理 1.2 線分 AP と L のなす角と線分 BP と L のなす角は等しい。
[証明] 接線 L 上のかってな点 Q を考えます。Q が接点 P でない限り Q は楕円 E の外にあります(このあたりまえのことが重要)。命題 1.1 により、不等式
AQ + BQ ≧ c
が成り立ちます。特に等号 接線 L に対して A と対称の位置にある点を A´ とします。このとき、
A´Q + BQ ≧ c
が成り立ち、Q = P のとき等号が成り立ちます。これは A´ から Q を経由して B に至る折れ線の長さは c 以上で、〔小沢哲也/著『曲線』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 x + e |
y = m x + d |
● n x + e = m x + d
∴ (n - m) x = d - e
▶ hx = (d - e) / (n - m);
▶ hy = n*hx + e;
▸ 直線 PB の傾き pb と y 切片の値 pd 。▶ pb = -py / (w - px);
▶ pd = -w*pb;
▣ 連立方程式の解を求めることで、直線 HA と直線 PB の交点の座標は計算できます。{ | y = n x + e |
y = pb x + pd |
● n x + e = pb x + pd
∴ (n - pb) x = pd - e
▶ 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>
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 件のコメント:
コメントを投稿