高校数学をプログラミングで解く(数学A編)「2-6 円に内接する四角形」
マガジンリスト > 数学A編 2.図形の性質 > 2-6 円に内接する四角形
はじめに
今回は、数学Aで学ぶ「円に内接する四角形」について、円とその円に内接する四角形を描くプログラムを作成します。
※なお、本記事で紹介するアルゴリズムは数学Iで学ぶ正弦定理や余弦定理、数学IIで学ぶ加法定理などを利用していますので、まだこのあたりの知識がない方は後回ししていただいても構いません。
円に内接する四角形を描くために必要な情報
まず、円に内接する四角形を描くために必要な情報について考えてみます。四角形の頂点や辺の長さを以下のようにします。
四角形が円に内接するときの条件は「四角形の対角の和は180°である」というものです。したがって、円に内接する四角形の4つの内角のうち隣り合う2つの内角がわかれば、他の2つの内角の大きさは計算することができます。
あとは四角形の大きさを指定します。そのために四角形の4つの辺のうち隣り合う2つの辺の長さを決めます。これらの条件から円に内接する四角形を描くことができます。
以下では、内角$${\mathrm{A}}$$と$${\mathrm{D}}$$の角度、辺の長さ$${a}$$と$${d}$$がわかっているとして考えていきます。
円に内接する四角形を描く
今回描く「円に内接する四角形」は以下のような図になります。
アルゴリズム設計(描くための手順)
今回の内接する四角形に対する情報「隣り合う2つの内角(図1の$${\mathrm{A}}$$と$${\mathrm{D}}$$)と隣り合う2辺の大きさ(図1の$${a}$$と$${d}$$)がわかっている」ときにこの四角形を描く手順は以下のように考えることができます。
①辺$${\mathrm{AC}}$$の長さを求める。
②頂点$${\mathrm{A, C, D}}$$の座標を求める。
③$${\triangle \mathrm{ACD}}$$の外心と外接円の半径を求める。
④頂点$${\mathrm{B}}$$の座標を求める。
⑤四角形$${\mathrm{ABCD}}$$とその外接円を描く。
以下で、この手順を順番に解説していきます。
辺ACの長さを求める
まず、対角線$${\mathrm{AC}}$$の長さ$${l}$$を求めます。
$${\triangle \mathrm{ACD}}$$の内角$${\mathrm{D}}$$に対して余弦定理を利用すると、
$$
l = \sqrt{a^2+d^2-2ad \cos D}
$$
と計算することができます。
頂点A, C, Dの座標を求める
次に、頂点$${\mathrm{A, C, D}}$$の座標を求めます。そのために座標系を設定します(図 4)。頂点$${\mathrm{A}}$$を原点とし、頂点$${\mathrm{A}}$$と頂点$${\mathrm{C}}$$を結んだ直線を右向き正とする$${x}$$軸、その直線と垂直に交わり、頂点$${\mathrm{A}}$$を通る直線を上向き正とする$${y}$$軸とします。その結果、頂点$${\mathrm{A}}$$の座標を$${(0,0)}$$、頂点$${\mathrm{C}}$$の座標を$${(l,0)}$$と置くことができます。また、頂点$${\mathrm{D}}$$は頂点$${\mathrm{A}}$$から距離$${a}$$、頂点$${\mathrm{C}}$$から距離$${d}$$の位置にあるので、頂点$${\mathrm{A}}$$を中心とする半径$${a}$$の円の方程式
$$
x^2+y^2=a^2
$$
と頂点$${\mathrm{C}}$$を中心とする半径$${d}$$の円の方程式
$$
(x-l)^2+y^2=d^2
$$
との交点が頂点$${\mathrm{D}}$$となります。この連立方程式を解くと、頂点$${\mathrm{D}}$$の座標$${(x_D, y_D)}$$は
$$
x_D = \frac{l^2+a^2-d^2}{2l}, \ y_D=\frac{\sqrt{(l+a+d)(-l+a+d)(l-a+d)(l+a-d)}}{2l}
$$
と求めることができます。
△ACDの外心と外接円の半径を求める
三角形の外心と外接円の半径の求め方については、別記事『高校数学をプログラミングで解く(数学A編)「2-3 三角形の五心」』で紹介しているので、ここでは導出は省略し、結果のみ紹介します。
外心$${\mathrm{O}}$$の座標$${(x_O, y_O)}$$は
$$
x_O = \frac{l}{2}, \ y_O = \frac{x_D^2+y_D^2-cx_D}{2y_D}
$$
となります。また、外接円の半径$${r_O}$$は
$$
r_O=\sqrt{x_O^2+y_O^2}
$$
で計算することができます。
頂点Bの座標を求める
あとは、頂点$${\mathrm{B}}$$の座標位置を求めます。頂点$${\mathrm{B}}$$の座標は直線$${\mathrm{AB}}$$と外接円とが交わる点となります。
直線$${\mathrm{AB}}$$の方程式は、
$$
y=-\tan \angle \mathrm{BAC} x
$$
となり、外接円の方程式は
$$
(x-x_O)^2+(y-y_O)^2=r_O^2
$$
となるので、頂点$${\mathrm{B}}$$の座標$${(x_B,y_B)}$$は、
$$
x_B=2 \cos \angle \mathrm{BAC} (x_O \cos \angle \mathrm{BAC} - y_O \sin \angle \mathrm{BAC} ), \\
y_B=-2 \sin \angle \mathrm{BAC} (x_O \cos \angle \mathrm{BAC} - y_O \sin \angle \mathrm{BAC} )
$$
と求めることができます。あとは、$${\sin \angle \mathrm{BAC}}$$と$${\cos \angle \mathrm{BAC}}$$を求めることで頂点$${\mathrm{B}}$$の座標を計算することができます。
$${ \angle \mathrm{BAC} = \mathrm{A} - \angle \mathrm{CAD} }$$ですので、加法定理を利用して、
$$
\sin \angle \mathrm{BAC} = \sin \mathrm{A} \cos \angle \mathrm{CAD} -\cos \mathrm{A} \sin \angle \mathrm{CAD}, \\
\cos \angle \mathrm{BAC} = \cos \mathrm{A} \cos \angle \mathrm{CAD} + \sin \mathrm{A} \sin \angle \mathrm{CAD}
$$
となります。一方、$${\triangle \mathrm{ACD}}$$に対して正弦定理を利用すると、
$$
\sin \angle \mathrm{CAD} = \frac{d}{l} \sin \mathrm{D}
$$
となり、また、$${\triangle \mathrm{ACD}}$$の$${ \angle \mathrm{CAD}}$$に対して余弦定理を利用すると、
$$
\cos \angle \mathrm{CAD} = \frac{l^2+a^2-d^2}{2la}
$$
となります。したがって、$${\sin \angle \mathrm{BAC}}$$と$${\cos \angle \mathrm{BAC}}$$は、これらの式を利用して計算することができます。
四角形ABCDとその外接円を描く
四角形$${\mathrm{ABCD}}$$の4つの頂点の座標がわかりましたので、あとは任意の図形を描く関数 beginShape と endShape を用いればこの四角形を描くことができます。ここでは、
$$
a=250, \ d=200, \ \mathrm{A}=105^{\circ}, \ \mathrm{D}=85^{\circ}
$$
として描いています。
// 円に内接する四角形を描く
// 隣り合う2つの辺の長さと隣り合う2つの内角が分かっている場合
void setup(){
size(500, 500); // キャンバスの大きさを指定する
translate(width/5, height/2); // 座標の中心を移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 四角形の2つの辺の長さa, d
float a, d;
a = 250.0;
d = 200.0;
// 四角形の2つの内角の大きさA, D
float A, D;
A = radians(105.0);
D = radians(85.0);
// 対角線ACの長さl
float l;
l = sqrt(a*a + d*d - 2.0*a*d*cos(D));
// 3つの頂点A,C,Dの座標
float A_x, A_y, C_x, C_y, D_x, D_y;
A_x = 0.0;
A_y = 0.0;
C_x = l;
C_y = 0.0;
D_x = (l*l + a*a - d*d) / 2.0 / l;
D_y = sqrt( (l+a+d) * (-l+a+d) * (l-a+d) * (l+a-d) ) / 2.0 / l;
// 外心の座標
float O_x, O_y;
O_x = l / 2.0;
O_y = ( a*a - l*D_x ) / 2.0 / D_y;
// 外接円の半径
float O_r;
O_r = sqrt(O_x*O_x + O_y*O_y);
// 頂点Bの座標を計算するための準備
float sin_CAD, cos_CAD;
sin_CAD = (a*a + l*l - d*d) / 2.0 / a /l;
cos_CAD = d * sin(D) / l;
float sin_BAC, cos_BAC;
sin_BAC = sin(A) * cos_CAD - cos(A) * sin_CAD;
cos_BAC = cos(A) * cos_CAD + sin(A) * sin_CAD;
// 頂点Bの座標
float B_x, B_y;
B_x = 2.0 * cos_BAC * (O_x * cos_BAC - O_y * sin_BAC );
B_y = -2.0 * sin_BAC * (O_x * cos_BAC - O_y * sin_BAC );
// 円に内接する四角形を描く
beginShape();
vertex(A_x, A_y);
vertex(B_x, B_y);
vertex(C_x, C_y);
vertex(D_x, D_y);
endShape(CLOSE);
// 外接円を描画する
stroke(0,0,255); // 青色
circle(O_x, O_y, 2.0*O_r);
// 外心を描画する
strokeWeight(5.0);
point(O_x, O_y);
}
ソースコード1 円に内接する四角形を描くプログラム
ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawCyclicQuadrilateral」としています)、テキストエディタ部分に書いて実行すると、円に内接する四角形が実行ウィンドウのキャンバスに描かれます。
まとめ
今回は、数学Aで学ぶ「円に内接する四角形」について、それを描くプログラムを作りました。描くポイントはここで登場する円が、内接する四角形の4つの頂点のうち3つの頂点を利用した三角形の外接円と同じであることです。このことを利用して4つ目の頂点の座標位置を求めることができました。
円に内接する四角形を描くために必要な条件として「隣り合う2辺の長さと隣り合う2つの内角がわかっていること」が挙げられることを説明しました。今回は実装しませんでしたが、円に内接する四角形を描くための条件として「3辺の長さと1つの内角がわかっていること」が挙げられます。この条件の場合も描くための手順は上記で説明した手順と同じです。例えば、3つの辺$${a,b,d}$$の長さと内角$${\mathrm{D}}$$がわかっているとすると、「辺$${\mathrm{AC}}$$の長さを求める」ところから「$${\triangle \mathrm{ACD}}$$の外心と外接円の半径を求める」ところまでの手順は同じとなり、頂点$${\mathrm{B}}$$の座標を求めるところが変わってきます。ただ、頂点$${\mathrm{B}}$$の座標は頂点$${\mathrm{A}}$$を中心とする半径$${b}$$の円と外接円との交点を求めればよいので、比較的簡単に求めることができると思います。演習問題としましたので、ぜひチャレンジしてみてください。
参考文献
改訂版 教科書傍用 スタンダード 数学A(数研出版、ISBN9784410209277)
演習問題
条件を「3辺の長さと1つの内角がわかっていること」として、円に内接する四角形を描くプログラムを作成してください。
なお、
$$
a=250, \ b=150, \ d=200, \ \mathrm{D}=85^{\circ}
$$
とします。
演習問題の解答例
ここから先は
この記事が気に入ったらチップで応援してみませんか?