AOJ 2537 : Billiard
問題概要
- W*Hのビリヤードのフィールドがあります。
- 一個目の玉をロボットが方向(vx,vy)に弾きます。
- 玉は壁にあたった際に鏡の反射をします。
- 初めに衝突する玉のid(2<=id<=N)を出力して下さい。
解法
- 反射を実装するのは面倒なので鏡像を利用します。
- 玉は直線に動くものとして当たる側の玉を鏡の反射で増殖させる。(↓イメージ)
- 上記の処理はcloneP関数でやってます。
- ここで気をつけるべきは、反射の境界線は玉の半径分だけ縮めなければならないことです。(↓のミドリの部分が境界線)
- それができたらあとは円と直線の当たり判定の問題。
ソースコード
感想
境界線が実際のW*Hではなく上下左右Rずつ縮むというのがポイントだと思う。
サンプルが弱いので自分でサンプルを作る力が大事。