高校数学をプログラミングで解く(数学A編)「2-3 三角形の五心」
マガジンリスト > 数学A編 2.図形の性質 > 2-3 三角形の五心
はじめに
今回は、数学Aで学ぶ「三角形の五心」(外心、内心、重心、垂心、傍心)について、そのうち外心、内心を求めて、三角形の外接円、内接円を描くプログラムを作成します。
三角形の五心
まず、三角形の五心について、まとめておきます。
外心
三角形の外心は「3辺の垂直二等分線が交わる点」となります(図1)。
三角形の外心はその三角形の外接円の中心となります。
内心
三角形の内心は「3つの内角の二等分線が交わる点」となります(図2)。
三角形の内心はその三角形の内接円の中心となります。
重心
三角形の重心は「3つの中線が交わる点」となります(図3)。
なお、三角形の重心は「各中線を$${2:1}$$に内分する」という特徴を持っています。
垂心
三角形の垂心は「3つの頂点から、向かい合う辺またはその延長に下した垂線が交わる点」となります(図4)。
傍心
三角形の傍心は「1つの内角と他の2つの外角の二等分線が交わる点」となります(図5)。
なお、三角形の傍心は1つの三角形に対して3つ存在します。
三角形を準備する
ここから、三角形の五心のうち、外心と内心を描くためのアルゴリズム設計とプログラミングを行っていきます。そのために、最初に三角形を準備しておきます。
三角形の準備
$${\triangle \mathrm{ABC}}$$を以下のようにします。
今回は、特に$${\triangle \mathrm{ABC}}$$の辺の長さの比が$${a:b:c=4:5:6}$$となるようにします。
頂点の座標位置
図6の三角形を描くために、各頂点の座標位置を求めます。以下のように、頂点$${\mathrm{A}}$$を座標系の原点とし、頂点$${\mathrm{A}}$$と頂点$${\mathrm{B}}$$を結んだ直線を右向き正とする$${x}$$軸、その直線と垂直に交わり、頂点$${\mathrm{A}}$$を通る直線を上向き正とする$${y}$$軸とします。
その結果、頂点$${\mathrm{A}}$$の座標を$${(0,0)}$$、頂点$${\mathrm{B}}$$の座標を$${(c,0)}$$と置くことができます。また、頂点$${\mathrm{C}}$$から直線$${\mathrm{AB}}$$に下した垂線と直線$${\mathrm{AB}}$$との交点を$${\mathrm{D}}$$とし、頂点$${\mathrm{C}}$$の座標を$${(x_C,y_C)}$$とします。
このとき、直角三角形$${\mathrm{ACD}}$$に対して三平方の定理を適用すると、
$$
x_C^2+y_C^2=b^2
$$
となり、直角三角形$${\mathrm{BCD}}$$に対して三平方の定理を適用すると、
$$
(c-x_C)^2+y_C^2=a^2
$$
となります。これら2つの方程式を連立させて解くと、頂点$${\mathrm{C}}$$の座標は
$$
x_C=\frac{b^2+c^2-a^2}{2c}, \ \ y_C=\frac{\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)}}{2c}
$$
と求めることができます。
三角形を描くプログラム
三角形の3つの頂点の座標がわかりましたので、あとは三角形を描く関数 triangle を用いればこの三角形を描くことができます。ここでは、各辺の長さをそれぞれ
$$
a=200, \ b=250, \ c=300
$$
として描いています。
// 辺の長さの比が4,5,6の三角形を描く
void setup(){
size(650, 650); // キャンバスの大きさを指定する
translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 三角形の辺の長さ
float a, b, c;
a = 200.0;
b = 250.0;
c = 300.0;
// 三角形の頂点の座標
float A_x, A_y, B_x, B_y, C_x, C_y;
A_x = 0.0;
A_y = 0.0;
B_x = c;
B_y = 0.0;
C_x = (c*c + b*b - a*a) / 2.0 / c;
C_y = sqrt( (a+b+c) * (-a+b+c) * (a-b+c) * (a+b-c) ) / 2.0 / c;
// 三角形を描く
triangle(A_x, A_y, B_x, B_y, C_x, C_y);
}
ソースコード1 三角形を描くプログラム
このソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawTriangle」としています)、テキストエディタ部分に書いて実行すると、実行ウィンドウのキャンバスに三角形が描かれます。
外心と外接円
この$${\triangle \mathrm{ABC}}$$に対して、外心と外接円を描いていきます。
外心を求める
まず外心を求めます。外心は「三角形の3辺の垂直二等分線が交わる点」になりますが、3辺の垂直二等分線を求める必要はなく、3辺のうちの2辺の垂直二等分線の交点を求めればよいです。今回は、辺$${\mathrm{AB}}$$と辺$${\mathrm{CA}}$$の垂直二等分線を求めることにします。
辺ABの垂直二等分線
辺$${\mathrm{AB}}$$の垂直二等分線は辺$${\mathrm{AB}}$$の中点$${\left(\frac{c}{2},0 \right)}$$を通り、$${y}$$軸に平行な直線となります。したがって、直線の方程式で表すと、
$$
x = \frac{c}{2}
$$
となります。
辺CAの垂直二等分線
次に、辺$${\mathrm{CA}}$$の垂直二等分線を考えます。辺$${\mathrm{CA}}$$の中点は$${\left(\frac{x_C}{2}, \frac{y_C}{2} \right)}$$となります。また、直線$${\mathrm{CA}}$$の傾きは$${\frac{y_C}{x_C}}$$となるので、辺$${\mathrm{CA}}$$の垂直二等分線の傾きは$${-\frac{x_C}{y_C}}$$となります。したがって、辺$${\mathrm{CA}}$$の垂直二等分線の方程式は、
$$
y=-\frac{x_C}{y_C}\left( x - \frac{x_C}{2} \right)+\frac{y_C}{2} = -\frac{x_C}{y_C}x +\frac{x_C^2+y_C^2}{2y_C} = -\frac{x_C}{y_C} x + \frac{b^2}{2y_C}
$$
となります。
外心Oの座標位置
辺$${\mathrm{AB}}$$の垂直二等分線の方程式と辺$${\mathrm{CA}}$$の垂直二等分線の方程式を求めることができたので、それらの直線の交点である外心$${\mathrm{O}}$$の座標$${(x_O,y_O)}$$を求めることができます。
$$
x_O=\frac{c}{2}, \ \ y_O=\frac{b^2-cx_C}{2y_C}
$$
外接円の半径
外接円の半径は外心$${\mathrm{O}}$$から三角形の各頂点への距離になります。特に、今回頂点$${\mathrm{A}}$$を座標の原点としているので、外接円の半径$${r_O}$$は
$$
r_O=\sqrt{x_O^2+y_O^2}
$$
となります。
外心と外接円を描くプログラム
外心$${\mathrm{O}}$$の座標$${(x_O,y_O)}$$と外接円の半径$${r_O}$$がわかりましたので、あとは円を描く関数 circle を用いれば外接円を描くことができます。ソースコード1に追記する形で三角形の外心と外接円を描くプログラムを作成します。
// 辺の長さの比が4,5,6の三角形に外心と外接円を描く
void setup(){
size(650, 650); // キャンバスの大きさを指定する
translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 三角形の辺の長さ
float a, b, c;
a = 200.0;
b = 250.0;
c = 300.0;
// 三角形の頂点の座標
float A_x, A_y, B_x, B_y, C_x, C_y;
A_x = 0.0;
A_y = 0.0;
B_x = c;
B_y = 0.0;
C_x = (c*c + b*b - a*a) / 2.0 / c;
C_y = sqrt( (a+b+c) * (-a+b+c) * (a-b+c) * (a+b-c) ) / 2.0 / c;
// 三角形を描く
triangle(A_x, A_y, B_x, B_y, C_x, C_y);
// 外心の座標
float O_x, O_y;
O_x = c / 2.0;
O_y = (b*b - c*C_x) / 2.0 / C_y;
// 外接円の半径
float O_r;
O_r = sqrt(O_x*O_x + O_y*O_y);
// 外接円を描画する
stroke(0,0,255);
circle(O_x, O_y, 2.0*O_r);
// 外心を描画する
strokeWeight(5.0);
point(O_x, O_y);
}
ソースコード2 外心と外接円を描くプログラム
このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawCircumscribedCircle」としています)、テキストエディタ部分に書いて実行すると、実行ウィンドウのキャンバスに三角形とその外心と外接円が描かれます。
内心と内接円
次に、$${\triangle \mathrm{ABC}}$$に対して、内心と内接円を描いていきます。
内心を求める
内接円を描くために、まず内心を求めます。内心は「三角形の3つの内角の二等分線が交わる点」になりますが、内角3つとも二等分線を求める必要はなく、3つの内角のうちの2つの内角の二等分線の交点を求めればよいです。今回は、内角$${\mathrm{A}}$$と内角$${\mathrm{B}}$$の二等分線を求めることにします。
内角Aの二等分線
内角$${\mathrm{A}}$$の二等分線と辺$${\mathrm{BC}}$$との交点を$${D(x_D, y_D)}$$とおきます。記事『高校数学をプログラミングで解く(数学A編)「2-2 三角形の辺の比」』でも見たように、$${\triangle \mathrm{ABC}}$$の内角$${\mathrm{A}}$$の二等分線と辺$${\mathrm{BC}}$$との交点は、辺$${\mathrm{BC}}$$を$${\mathrm{AB}:\mathrm{AC}=c:b}$$に内分するので、
$$
x_D = \frac{c(b+x_C)}{b+c}, \ y_D=\frac{c y_C}{b+c}
$$
となります。したがって、内角$${\mathrm{A}}$$の二等分線は、
$$
y=\frac{y_D}{x_D}x=\frac{y_C}{b+x_C}x
$$
となります。
内角Bの二等分線
内角$${\mathrm{B}}$$の二等分線と辺$${\mathrm{CA}}$$との交点を$${E(x_E, y_E)}$$とおきます。$${\triangle \mathrm{ABC}}$$の内角$${\mathrm{B}}$$の二等分線と辺$${\mathrm{CA}}$$との交点は、辺$${\mathrm{CA}}$$を$${\mathrm{BC}:\mathrm{BA}=a:c}$$に内分するので、
$$
x_E = \frac{c x_C}{a+c}, \ y_E=\frac{c y_C}{a+c}
$$
となります。したがって、内角$${\mathrm{B}}$$の二等分線は、
$$
y=\frac{y_E-y_B}{x_E-x_B}(x-x_B)+y_B =\frac{c y_C}{c x_C - c(a+c)}(x-c)=\frac{y_C}{x_C-a-c}(x-c)
$$
となります。
内心Iの座標位置
内角$${\mathrm{A}}$$の二等分線の方程式と内角$${\mathrm{B}}$$の二等分線の方程式を求めることができたので、それらの直線の交点である内心$${\mathrm{I}}$$の座標$${(x_I, y_I)}$$を求めることができます。
$$
x_I = \frac{-a+b+c}{2}, \ \ y_I = \frac{c y_C}{a+b+c}
$$
内接円の半径
内接円の半径は辺$${\mathrm{AB}}$$から内心$${\mathrm{I}}$$への高さになります。特に、今回辺$${\mathrm{AB}}$$を$${x}$$軸と一致させているので、内接円の半径$${r_I}$$は
$$
r_I=y_I
$$
となります。
内心と内接円を描くプログラム
内心$${\mathrm{I}}$$の座標$${(x_I,y_I)}$$と内接円の半径$${r_I}$$がわかりましたので、あとは円を描く関数 circle を用いれば内接円を描くことができます。ソースコード1に追記する形で三角形の内心と内接円を描くプログラムを作成します。
// 辺の長さの比が4,5,6の三角形に内心と内接円を描く
void setup(){
size(650,650); // キャンバスの大きさを指定する
translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 三角形の辺の長さ
float a, b, c;
a = 200.0;
b = 250.0;
c = 300.0;
// 三角形の頂点の座標
float A_x, A_y, B_x, B_y, C_x, C_y;
A_x = 0.0;
A_y = 0.0;
B_x = c;
B_y = 0.0;
C_x = (c*c + b*b - a*a) / 2.0 / c;
C_y = sqrt( (a+b+c) * (-a+b+c) * (a-b+c) * (a+b-c) ) / 2.0 / c;
// 三角形を描く
triangle(A_x, A_y, B_x, B_y, C_x, C_y);
// 内心の座標
float I_x, I_y;
I_x = (-a+b+c)/2.0;
I_y = c * C_y / (a+b+c);
// 内接円の半径
float I_r;
I_r = I_y;
// 内接円を描画する
stroke(0,0,255);
circle(I_x, I_y, 2.0*I_r);
// 内心を描画する
strokeWeight(5.0);
point(I_x, I_y);
}
ソースコード3 内心と内接円を描くプログラム
このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawInscribedCircle」としています)、テキストエディタ部分に書いて実行すると、実行ウィンドウのキャンバスに三角形とその内心と内接円が描かれます。
まとめ
今回は、数学Aで学ぶ「三角形の五心(外心、内心、重心、垂心、傍心)」のうち外心と内心についてその外接円と内接円とともに描くプログラムを作りました。
このプログラミングを行う際、事前に外心や内心の位置と外接円や内接円の半径の大きさを求めました。このとき、「三角形を準備する」の節で説明したように三角形に対して座標系をうまく設定してやることで、三角形の各頂点の座標位置や、外心や内心の座標位置、そして外接円の半径や内接円の半径も比較的簡単に算出することができました。このような工夫を行うことは、簡潔なプログラムを書くことに役に立ちます。
今回は実装しませんでしたが、三角形の五心の残り 重心、垂心、傍心 も、外心や内心と同様に描くことができます。重心、垂心、傍心の座標位置は「三角形を準備する」の節で設定した座標系を利用して比較的簡単に求めることができると思いますので、ぜひチャレンジしてみてください。
参考文献
改訂版 教科書傍用 スタンダード 数学A(数研出版、ISBN9784410209277)
演習問題
図6の$${\triangle ABC}$$について重心の位置を計算して、キャンバス上に描くプログラムを作成してください。
演習問題の解答例
ここから先は
この記事が気に入ったらサポートをしてみませんか?