高校数学をプログラミングで解く(数学A編)「2-1 線分の内分、外分」
マガジンリスト > 数学A編 2.図形の性質 > 2-1 線分の内分、外分
はじめに
今回は、数学Aで学ぶ「線分の内分、外分」について、与えられた線分に対して内分点や外分点を描くプログラムを作成します。
線分の内分、外分
まず、線分$${\mathrm{AB}}$$に対する内分点、外分点について、復習しておきます。
線分$${\mathrm{AB}}$$の端点$${\mathrm{A}}$$の座標を$${(x_A, y_A)}$$、もう一方の端点$${\mathrm{B}}$$の座標を$${(x_B, y_B)}$$とします。このとき、線分$${\mathrm{AB}}$$を$${m:n}$$に内分する点$${\mathrm{P}(x_P, y_P)}$$は、
$$
x_P = \frac{nx_A+mx_B}{m+n}, \ \ y_P = \frac{ny_A+my_B}{m+n}
$$
で得られ、線分$${\mathrm{AB}}$$を$${m:n}$$に外分する点$${\mathrm{Q}(x_Q, y_Q)}$$は、
$$
x_Q = \frac{-nx_A+mx_B}{m-n}, \ \ y_Q = \frac{-ny_A+my_B}{m-n}
$$
で得られます。
線分の内分点、外分点を描く
今回は次のような問題を考えてみます。
問題
図1のような線分$${\mathrm{AB}}$$に対して、以下の内分点、外分点を描け。
(1) 線分$${\mathrm{AB}}$$を$${3:2}$$に内分する点$${\mathrm{P}}$$
(2) 線分$${\mathrm{AB}}$$を$${3:2}$$に外分する点$${\mathrm{Q}}$$
(3) 線分$${\mathrm{AB}}$$を$${2:3}$$に内分する点$${\mathrm{R}}$$
(4) 線分$${\mathrm{AB}}$$を$${2:3}$$に外分する点$${\mathrm{S}}$$
アルゴリズム設計
今回、頂点$${\mathrm{A,B}}$$の座標$${(x_A, y_A)}$$、$${(x_B, y_B)}$$をそれぞれ、$${x_A=50, y_A=50, x_B=150, y_B=100 }$$と設定します。あとは、内分点、外分点を求める式を利用してそれらの座標位置を求めてプロットします。
線分ABを描くプログラム
内分点、外分点をプロットする前に、まず線分$${\mathrm{AB}}$$を描くプログラムを作成します。
// 線分ABを描く
void setup(){
size(1000, 500); // キャンバスの大きさを指定する
translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 点A,Bの座標
float A_x, A_y, B_x, B_y;
A_x = 50.0;
A_y = 50.0;
B_x = 150.0;
B_y = 100.0;
// 線分ABを描く
line(A_x, A_y, B_x, B_y);
}
ソースコード1 線分$${\mathrm{AB}}$$を描くプログラム
このソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawSegment」としています)、テキストエディタ部分に書いて実行します。
その結果、図2のように、線分が実行ウィンドウのキャンバスに描かれます。
プログラムの解説1「座標系の準備」
ソースコード1の最初の size 関数から noLoop 関数までの部分は高校数学でよく利用される座標系を設定しています。詳しくは、記事『高校数学をプログラミングで解く(数学A編)「2-0 高校数学に適した座標系の準備」』をご覧ください。
プログラムの解説2「line関数」
実行ウィンドウのキャンバス上に線分を描くためには line 関数を利用します。
line(A_x, A_y, B_x, B_y);
line 関数の引数は4つあり、左から順に
A_x : 線分の1つの端点の$${x}$$座標 float型
A_y : 線分の1つの端点の$${y}$$座標 float型
B_x : 線分のもう1つの端点の$${x}$$座標 float型
B_y : 線分のもう1つの端点の$${y}$$座標 float型
となります。
内分点、外分点を描くプログラム
では、線分の内分点、外分点を描くプログラムを作成していきます。
// 線分ABの内分点、外分点を描く
void setup(){
size(1000, 500); // キャンバスの大きさを指定する
translate(width/2, height/2); // 座標の中心をキャンバスの中心に移動する
scale(1,-1); // y軸正の向きを下向きから上向きに反転する
background(255,255,255); // 背景を白色にする
noFill(); // 図形の塗りつぶしなし
noLoop(); // 繰り返し処理をしない
// 点A,Bの座標
float A_x, A_y, B_x, B_y;
A_x = 50.0;
A_y = 50.0;
B_x = 150.0;
B_y = 100.0;
// 線分ABを描く
line(A_x, A_y, B_x, B_y);
// 内分、または外分するときの比 m:n
float m, n;
m = 3.0;
n = 2.0;
strokeWeight(5.0); // 点の太さを調整
// (1) 線分ABを3:2に内分する点P
float P_x, P_y;
P_x = (n * A_x + m * B_x) / (m + n);
P_y = (n * A_y + m * B_y) / (m + n);
stroke(255,0,0); // 赤色
point(P_x, P_y);
// (2) 線分ABを3:2に外分する点Q
float Q_x, Q_y;
Q_x = (-n * A_x + m * B_x) / (m - n);
Q_y = (-n * A_y + m * B_y) / (m - n);
stroke(0,255,0); // 緑色
point(Q_x, Q_y);
// 比の値を変更
m = 2.0;
n = 3.0;
// (3) 線分ABを2:3に外分する点R
float R_x, R_y;
R_x = (n * A_x + m * B_x) / (m + n);
R_y = (n * A_y + m * B_y) / (m + n);
stroke(0,0,255); // 青色
point(R_x, R_y);
// (4) 線分ABを2:3に外分する点S
float S_x, S_y;
S_x = (-n * A_x + m * B_x) / (m - n);
S_y = (-n * A_y + m * B_y) / (m - n);
stroke(0,255,255); // 水色
point(S_x, S_y);
}
ソースコード2 内分点、外分点を描くプログラム
このソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「internal_external_division」としています)、テキストエディタ部分に書いて実行します。
図3のように、線分$${\mathrm{AB}}$$と線分$${\mathrm{AB}}$$に対する内分点、外分点を実行ウィンドウ内のキャンバス上に描きます。このままでは少しわかりにくいので、各点にラベルを振ったものも以下に示しておきます。
プログラムの解説「内分点、外分点の計算」
今回のプログラム(ソースコード2)では、線分の内分(または外分)の比率$${m:n}$$を与えて、内分点(または外分点)を算出する計算式を用いて計算しています。
// 内分、または外分するときの比 m:n
float m, n;
m = 3.0;
n = 2.0;
strokeWeight(5.0); // 点の太さを調整
// (1) 線分ABを3:2に内分する点P
float P_x, P_y;
P_x = (n * A_x + m * B_x) / (m + n);
P_y = (n * A_y + m * B_y) / (m + n);
なお、計算する際の演算子の優先順位は高校数学で学んだものと同じで、括弧の中の演算、掛け算割り算、足し算引き算などの順になります。
まとめ
今回は、数学Aで学ぶ「線分の内分、外分」について、与えられた線分に対して内分点や外分点を描くプログラムを作成しました。
内分点や外分点の計算式は特に難しい式ではないです。式を書くときに演算子の優先順位が高校数学で学んだものと同じで、括弧の中の演算、掛け算割り算、足し算引き算などの順になることに注意すれば特に問題ないでしょう。
最後に、プログラミングで式を書くときによくある間違いを示しておきます。例えば、
$$
x= \frac{b}{2a}
$$
という式を
x = b / 2*a;
と書いてしまうことがありますが、これは間違いです。この式は、
$$
x=\frac{b}{2} a
$$
という計算式を意味します。正しくは、
x = b / (2*a);
とするか、
x = b / 2 / a;
とします。
このような間違いはプログラムを何度も書いていくうちに少しずつ減っていきますので、どんどん経験を積んでいきましょう。
参考文献
改訂版 教科書傍用 スタンダード 数学A(数研出版、ISBN9784410209277)
演習問題
図1のような線分$${\mathrm{AB}}$$に対して、$${3:5}$$に外分する点$${\mathrm{T}}$$を求めて赤色でプロットし、線分$${\mathrm{AT}}$$を青色で描くプログラムを作成してください。ただし、頂点$${\mathrm{A,B}}$$の座標$${(x_A, y_A)}$$、$${(x_B, y_B)}$$をそれぞれ、$${x_A=50, y_A=50, x_B=150, y_B=100 }$$とします。
演習問題の解答例
ここから先は
この記事が気に入ったらサポートをしてみませんか?