Evolton

九州大学 1999年度 前期日程 第2次学力試験 図形と方程式文系数学 第3問(c)

次の(1),(2)では,それぞれ,その目的を実行するためのBASICによるプログラムの始めの部分が与えられている.
方針を記述してから,プログラムの残りの部分を完成せよ.
ただし,変数A(1),A(2)等には座標a1a2等が入力されるものとする.

注意:(1)のプログラムでは配列を表すためにDIM文を使っているが,DIM文を使わないプログラムを作成してもよい.
そのときは,行番号10の文は消去し,行番号20,30の文は

20 INPUT A1, A2

30 INPUT P1, P2

で置き換えるものとする.(2)についても,同様である.

(1) 座標平面上の原点Oと異なる点A(a1,a2)について,
任意の点P(p1,p2)から直線OAへの距離を表示すること.

10 DIM A(2), P(2)

20 INPUT A(1), A(2)

30 INPUT P(1), P(2)

(2)A(a1,a2)B(b1,b2)を座標平面上の相異なる点とし,直線ABで平面を二分する.
P(p1,p2)Q(q1,q2)がこの直線の同じ側にあるときは1を,異なる側にあるときは1を,
PQの少なくとも一方がこの直線上にあるときは0を表示すること.
ただし,ある点と直線との距離が,与えられた正数0.00001より小さいときは
その点は直線上にあるとみなすことにする.

10 DIM A(2), B(2), P(2), Q(2)

20 EPS=0.00001

30 INPUT A(1), A(2)

40 INPUT B(1), B(2)

50 INPUT P(1), P(2)

60 INPUT Q(1), Q(2)

難易度5/ 10計算量5/ 10目安12

図形と方程式 座標設定、計算整理、必要十分条件

方針

(1) は直線 OAa2xa1y=0 と書き,点と直線の距離公式をそのままプログラムにする。(2) は直線 AB の左辺に P,Q を代入した値の符号で同じ側か異なる側かを判定する。ただし距離が 0.00001 未満なら直線上とみなすため,代入値を直線係数の長さで割ってからしきい値と比べる。方針としては,距離判定を先に行い,その後で符号の積を見る。

解答

(1)

直線 OA は原点と A(a1,a2) を通るので,方程式は a2xa1y=0 である。したがって点 P(p1,p2) からこの直線までの距離は a2p1a1p2a12+a22 である。よってプログラムの残りは,この式を計算して表示すればよい。10DIM A(2),P(2)20INPUT A(1),A(2)30INPUT P(1),P(2)40D=ABS(A(2)P(1)A(1)P(2))/SQR(A(1)2+A(2)2)50PRINT D60END(2)

直線 AB(b2a2)x(b1a1)ya1b2+a2b1=0 と書ける。点 (x,y) をこの左辺に代入した値を D(x,y) とする。D(P)D(Q) の符号が同じなら同じ側,異なれば異なる側である。ただし,直線からの距離は D(x,y)(b2a2)2+(b1a1)2 なので,これが EPS=0.00001 より小さいときは直線上とみなす。

したがって,例えば次のようにすればよい。10DIM A(2),B(2),P(2),Q(2)20EPS=0.0000130INPUT A(1),A(2)40INPUT B(1),B(2)50INPUT P(1),P(2)60INPUT Q(1),Q(2)70L=SQR((B(2)A(2))2+(B(1)A(1))2)80DP=(B(2)A(2))P(1)(B(1)A(1))P(2)A(1)B(2)+A(2)B(1)90DQ=(B(2)A(2))Q(1)(B(1)A(1))Q(2)A(1)B(2)+A(2)B(1)100IF ABS(DP)/L<EPS THEN PRINT 0:END110IF ABS(DQ)/L<EPS THEN PRINT 0:END120IF DPDQ>0 THEN PRINT 1 ELSE PRINT 1130END行100,110で点が直線上とみなされる場合を先に除いている。その後は DPDQ の符号だけを見ればよい。

別解

解法2

方針

直線の向きベクトルとの行列式を使う。行列式の絶対値を方向ベクトルの長さで割れば距離となり、符号は直線のどちら側かを表す。配列を使わないBASICとして実装する。

解答

(1)
距離は2次元の行列式を使ってD=A1P2A2P1A12+A22である。配列を使わない形なら20INPUT A1,A230INPUT P1,P240D=ABS(A1P2A2P1)/SQR(A12+A22)50PRINT D60ENDとすればよい。

(2) AB=(U,V)=(B1A1,B2A2) とし、DP=U(P2A2)V(P1A1),DQ=U(Q2A2)V(Q1A1)とおく。絶対値を U2+V2 で割ったものが距離で、符号が側を表す。70U=B1A1:V=B2A2:L=SQR(U2+V2)80DP=U(P2A2)V(P1A1)90DQ=U(Q2A2)V(Q1A1)100IF ABS(DP)/L<EPS THEN PRINT 0:END110IF ABS(DQ)/L<EPS THEN PRINT 0:END120IF DPDQ>0 THEN PRINT 1 ELSE PRINT 1130ENDで完成する。

総評

点と直線の距離公式,および直線の左辺の符号による半平面判定をプログラムに翻訳する問題である。所要時間は12分程度。(1) は式を正しく作れば短いが,分母の a12+a22 を落としやすい。(2) は「直線上とみなす」条件が距離で与えられているため,代入値そのものではなく D/LEPS と比較する必要がある。符号判定を先にしてしまうと,ほぼ直線上の点を誤って同じ側・異なる側に分類するので,しきい値判定を先に置く構成が安全である。 主解法と第2解法を別々に再計算し、条件範囲、端点、等号成立条件まで照合した。

冊子PDFで見る九大の図形と方程式の問題で問題集を作る

出典: 九州大学 1999年度 前期 文系 第3問。問題文はHTML表示のために再入力・数式組版しています。