九州大学 1999年 文系 第5問 解説

方針・初手
(1)
点と直線の距離の公式を用いて、点 $P(p_1, p_2)$ から直線 $OA$ までの距離を数式で表す。その後、その数式を BASIC で計算可能な変数と組み込み関数(平方根を表す SQR、絶対値を表す ABS)を用いてプログラムの処理に落とし込む。
(2)
直線 $AB$ の方程式を $f(x, y) = 0$ の形に整理し、点 $P(p_1, p_2), Q(q_1, q_2)$ の座標を代入した値 $f(p_1, p_2), f(q_1, q_2)$ を利用する。 まず、それぞれの点と直線 $AB$ との距離を求め、与えられた誤差の許容値 $\text{EPS}$ と比較することで「直線上にあるか」を判定する。 どちらの点も直線上にないと判定された場合は、$f(p_1, p_2) \times f(q_1, q_2)$ の符号を調べることで、「直線の同じ側にあるか、異なる側にあるか」を判定できる。
解法1
(1)
原点 $O(0, 0)$ と点 $A(a_1, a_2)$ を通る直線 $OA$ の方程式は、$a_2 x - a_1 y = 0$ と表せる。 点 $P(p_1, p_2)$ と直線 $OA$ の距離 $d$ は、点と直線の距離の公式より
$$d = \frac{|a_2 p_1 - a_1 p_2|}{\sqrt{a_1^2 + a_2^2}}$$
となる。 プログラムではこれを変数を用いた式に直し、計算結果を表示すればよい。
方針
直線 $OA$ の方程式を $a_2 x - a_1 y = 0$ として、点 $P(p_1, p_2)$ との距離を公式を用いて計算する。絶対値は ABS 関数、平方根は SQR 関数を用いて表し、計算結果を表示して終了する。
プログラムの残りの部分
40 D = ABS(A(2) * P(1) - A(1) * P(2)) / SQR(A(1) * A(1) + A(2) * A(2)) 50 PRINT D 60 END
(2)
点 $A(a_1, a_2)$、点 $B(b_1, b_2)$ を通る直線 $AB$ の方程式は、
$$(b_2 - a_2)(x - a_1) - (b_1 - a_1)(y - a_2) = 0$$
と表せる。ここで、左辺を $f(x, y)$ とおく。 任意の点 $(x, y)$ から直線 $AB$ までの距離 $d$ は、
$$d = \frac{|f(x, y)|}{\sqrt{(b_2 - a_2)^2 + (b_1 - a_1)^2}}$$
である。
点 $P, Q$ について、それぞれ $f(p_1, p_2)$ と $f(q_1, q_2)$ を計算し、各点と直線 $AB$ の距離を求める。
これが $\text{EPS}$ より小さい場合は、少なくとも一方が直線上にあるとみなして 0 を表示する。
それ以外の場合、$P$ と $Q$ が直線 $AB$ に関して同じ側にある条件は $f(p_1, p_2)$ と $f(q_1, q_2)$ が同符号であること、異なる側にある条件は異符号であることである。したがって、$f(p_1, p_2) \times f(q_1, q_2)$ の値が正ならば 1 を、負ならば -1 を表示する。
方針
$D_x = b_1 - a_1, D_y = b_2 - a_2$ とおき、$f(x, y) = D_y(x - a_1) - D_x(y - a_2)$ とする。
点 $P, Q$ に対して $f(p_1, p_2)$ と $f(q_1, q_2)$ の値を求め、それぞれの点から直線 $AB$ までの距離を計算する。
いずれかの距離が $\text{EPS}$ より小さければ 0 を出力する。
そうでないとき、$f(p_1, p_2)$ と $f(q_1, q_2)$ の積が正なら同じ側として 1 を、負なら異なる側として -1 を出力する。
プログラムの残りの部分
70 DX = B(1) - A(1) 80 DY = B(2) - A(2) 90 L = SQR(DX * DX + DY * DY) 100 F1 = DY * (P(1) - A(1)) - DX * (P(2) - A(2)) 110 F2 = DY * (Q(1) - A(1)) - DX * (Q(2) - A(2)) 120 IF ABS(F1) / L < EPS OR ABS(F2) / L < EPS THEN PRINT 0 : GOTO 160 130 IF F1 * F2 > 0 THEN PRINT 1 140 IF F1 * F2 < 0 THEN PRINT -1 150 GOTO 160 160 END
解説
BASICでの数学計算の基本(絶対値 ABS、平方根 SQR などの組み込み関数の使い方)と、図形と方程式の知識を組み合わせる問題である。
直線の式 $ax+by+c=0$ の左辺の式の値の正負によって、座標平面上の領域が直線のどちら側にあるかを判定できるという基本事項を理解しているかが問われている。
また、計算機上で実数の等号判定を行う際には、丸め誤差を考慮して微小な正の数(この問題では $\text{EPS}$)を用いて距離で判定するという、プログラミング特有の工夫に触れられている点も特徴的である。
答え
(1) 方針およびプログラムの残りの部分は「解法1」に示した通りである。
(2) 方針およびプログラムの残りの部分は「解法1」に示した通りである。
自分の記録
誤りを報告
解説の誤り、誤字、表示崩れに気づいた場合は送信してください。ログイン不要です。











