AOJ 2537 : Billiard

Billiard | Aizu Online Judge

問題概要

  • W*Hのビリヤードのフィールドがあります。
  • 一個目の玉をロボットが方向(vx,vy)に弾きます。
  • 玉は壁にあたった際に鏡の反射をします。
  • 初めに衝突する玉のid(2<=id<=N)を出力して下さい。

解法

  • 反射を実装するのは面倒なので鏡像を利用します。
  • 玉は直線に動くものとして当たる側の玉を鏡の反射で増殖させる。(↓イメージ)

    f:id:satelliteyezu:20160420170901p:plain

  • 上記の処理はcloneP関数でやってます。
  • ここで気をつけるべきは、反射の境界線は玉の半径分だけ縮めなければならないことです。(↓のミドリの部分が境界線)
  • f:id:satelliteyezu:20160420172234p:plain
  • それができたらあとは円と直線の当たり判定の問題。
ソースコード

感想

境界線が実際のW*Hではなく上下左右Rずつ縮むというのがポイントだと思う。

サンプルが弱いので自分でサンプルを作る力が大事。