Hatena::ブログ(Diary)

わさっき RSSフィード

2015年02月27日

三角形三角形問題〜2. 数学そしてプログラミング

いきなりですが問題です.

三角形ABCに対して,3点D,E,Fを,以下の条件をすべて満たす点とする.

条件1: A,D,Fはこの順に同一直線上にあり,AD:DF=a:1

条件2: B,E,Dはこの順に同一直線上にあり,BE:ED=b:1

条件3: C,F,Eはこの順に同一直線上にあり,CF:FE=c:1

ただし,a,b,cはいずれも正の実数とする.

f:id:takehikom:20150226060506p:image

このとき,以下の各問に答えよ.

(1) △ABC:△DEFを,a,b,cを用いた比で表せ.ここで△XYZは三角形XYZの面積とする.

(2) A,B,Cの各座標およびa,b,cが,計算機で表現できる値のとき,3点D,E,Fの座標を求める手順を答えよ.

(3) a,b,cが正の整数のとき,三角形ABCが与えられたときに3点D,E,Fを定規とコンパスで求める手順を答えよ.

昨日付の記事で書いた「(a+1)(b+1)(c+1)−abc倍」「位置決めや,作図」について,さっそくですが解答します.


(1) まず,下図のように,AE,BF,CDをそれぞれ結びます.

f:id:takehikom:20150226060508p:image

s=△DEFとおくと,△EDF:△EDA=DF:DA=1:aなので△EDA=asです.同様に,△FED:△FEB=ED:EB=1:bより△FEB=bs,△DFE:△DFC=FE:FC=1:cより△DFC=csを得ます.

f:id:takehikom:20150226060509p:image

次に,△AED:△AEB=ED:EB=1:bより,△AEB=b△AEDabsです.同様に,△BFE:△BFC=FE:FC=1:cより△BFC=c△BFE=bcs,△CDF:△CDA=DF:DA=1:aより△CDA=a△CDF=casを得ます.

これで,△ABC内を構成する7つの部分図形(いずれも三角形)の面積は,sの式で表すことができます.

f:id:takehikom:20150226060510p:image

ABC=△DEF+△EDA+△FEB+△DFC+△AEB+△BFC+△CDA=s+as+bscsabs+cbs+cas=(ab+bc+ca+a+b+c+1)sなので,△ABC:△DEF=(ab+bc+ca+a+b+c+1) :1となります.

ここでab+bc+ca+a+b+c+1=abc+ab+bc+ca+a+b+c+1−abc=(a+1)(b+1)(c+1)−abcと変形すると,△ABC:△DEF={(a+1)(b+1)(c+1)−abc}:1と表すこともできます.

昨日付記事は,a=2,b=1,c=3の場合でしたので,(a+1)(b+1)(c+1)−abc=3・2・4−2・1・3=24−6=18となり,△ABC:△DEF=18:1です.


(2) 前問に加えて,補助線を引きます.点Gを直線AFとBCの交点,点Hを直線BDとCAの交点,点Iを直線CEとABの交点とします.

f:id:takehikom:20150226060511p:image

ここで三角形EACに着目すると,△EDA:△EDC=AH:CHとなります.というのも,Hを通るEHの垂線を引き,その直線と,Aを通るEHとの平行線の交点をP,およびCを通るEHとの平行線との交点をQとすると,△EDA=ED・PH/2,△EDC=ED・QH/2となります.直線PQと直線ABが異なる場合は,△HPA∽△HQBなので,AH:CH=PH:QHです.ここまでの式を整理することで△EDA:△EDC=AH:CHを得ます.直線PQと直線ABが一致する場合は,PとA,QとCはそれぞれ同じ点になりますので,PH=AH,QH=CHより,やはり△EDA:△EDC=AH:CHを得ます.

△EDC=△DEF+△DFC=(c+1)sですので,AH:CH=a:(c+1)となります.

同様にして,三角形ABCとその周上の点について,以下の式が得られます.

AI:BI=(a+1):b

BG:CG=(b+1):c

CH:AH=(c+1):a

f:id:takehikom:20150226060512p:image

ここまでは,3点D,E,Fを所与としていました.これらがない状態から,その決定方法を手順として書くと,次のとおりです.

1. BG:CG=(b+1):cを満たす点G,CH:AH=(c+1):aを満たす点H,AI:BI=(a+1):bを満たす点Iを求める.

2. 直線AG,直線BH,直線CIをそれぞれ求める.

3. 2直線AGおよびBHの交点をD,2直線BHおよびCIの交点をE,2直線CIおよびAGの交点をFとする.

プログラミングにおいては,内分点と,2点を通る直線,2直線の交点を求める処理を定義するか,ライブラリなどから呼び出すことで,それぞれの値(点なら座標,直線においては係数ほか)を求めることができます.

(3) 線分ABを(a+1):bの比に内分する点をIを求めるには,直線ABと異なり,Aを通る直線を引きます.その直線上で,Aを起点にコンパスで1単位長から(a+b+1)単位長までの頂点をとります*1.Aを起点に(a+b+1)単位長離れた頂点とBとを結び,その直線と平行で,Aを起点に(a+1)単位長離れた頂点を通る直線を引きます.この直線と,直線ABとの交点が,Iとなります.GおよびHも同様です.2直線の交点は,プログラミングよりももっと簡単です.


作図プログラムGistに置いておきます.いつものようにRubyスクリプトで,描画はconvertコマンドです.文字描画はIPAexゴシックがデフォルトです.他のフォントにしたり,フォントサイズを変えたりすると,表示が乱れる可能性があります.

昨日付の問題では,原文ママということでAEにも線分を引いたのですが,本日の検討にあたっては,最初に引いておく必要はありません.この対処にも,少しだけ手間をかけました.

*1:2単位長,4単位長,…というとり方と組み合わせれば,操作を減らすことができます.正整数xに対して,Aからx単位長まで離れたところをとるのには,xを2進数で表したときの桁数(ビット長)のたかだか2倍の回数のコンパス操作で行えます.

リンク元