AOJ 2562/JAG春コンテスト2012H: Rings

JAG春コンテスト2012の問題がAOJに収録されたので,以前書いたコードを投げてみました
公式の解説によれば

  1. 座標変換
  2. 平面同士の交線を求める
  3. 円と直線の交点を求める

ということをするらしいですが,そんな回りくどいことしなくても解けるということで久しぶりにブログ書いてみます.

まずは記号の定義です.
円1について,中心を\bf{c}_1とし,中心から円周への直交するベクトルを\bf{u}_1,\bf{v}_1とします.
円2についても同様です.

とりあえず円2について考えてみます.まずは2次元で考えましょう.
2次元の円上の点は,角度θを用いて(cosθ,sinθ)と表せます.
これは,直交する単位ベクトル(1,0), (0,1)を用いれば (1,0)cosθ+(0,1)sinθ とも書けます.
もっと言えば,直交する単位ベクトル\bf{u},\bf{v}を用いて\bf{u}\cos \theta+\bf{v}\sin \thetaと書けるはずです.
(より一般に,\bf{u},\bf{v}が直交していれば,\bf{u}\cos \theta+\bf{v}\sin \thetaは楕円となるはずです.図1参照.)
最早これは2次元に限った話ではなく,当然3次元でも同様の表記が可能です.
すなわち,円2上の点は,角度θを用いてp_2=\bf{c}_2+\bf{u}_2\cos \theta+\bf{v}_2\sin \thetaと表すことができます.
f:id:climpet:20140228001054p:plain

次に,円1について考えます.
円1を含む平面S1について,2つの円が繋がっているのは,次の条件を満たすときです.

  1. S1と円2の交点が2つ存在する.
  2. 2つの交点について,片方が円1の内側,もう片方が円1の外側にある.

さて,S1の法線ベクトルは\bf{n}_1=\bf{u}_1 \times \bf{v}_1です.
ここで,\bf{p}_2がS1上にあるならば,(\bf{p}_2-\bf{c}_1)\cdot \bf{n}_1=0が成り立つはずです(図2参照).
これとさっきの\bf{p}_2の式を合わせて色々整理すると,
a cosθ+b sinθ+d=0 という式になります.
さらにここらへんの式を使うと,
e sin(θ+φ)+d=0
という式になります.a,b,d,e,φについては普通に計算できるはずなので,各自計算してください*1
この式から,(交点が存在するならば)θを2つ求め,それぞれp_2=\bf{c}_2+\bf{u}_2\cos \theta+\bf{v}_2\sin \thetaにぶちこめば
p_2が求まります.
あとは,それが円1の内側かどうか判定すればよいです.これは,|\bf{p}_2-\bf{c}_1|<1であれば内側,さもなくば外側となります.
f:id:climpet:20140228001103p:plain

所々端折りましたが,以上のような手順で,高校数学程度の知識(のはず)があれば,座標変換など使わずに答えを求めることができます.

*1:ぶっちゃけ結果忘れました