AOJ Vol.1 0115 Starship UAZ Advance

AOJ「Starship UAZ Advance」に挑戦。

方針

  1. 簡単のため,自機の座標を原点として考える
  2. 敵機の座標を(x_e, y_e, z_e)(自機原点)とする
  3. バリアの3点を(x_0, y_0, z_0), (x_1, y_1, z_1), (x_2, y_2, z_2)(自機原点)とする
  4. ベクトル\vec{V_e} = (x_e, y_e, z_e)を,バリア3点のベクトル\vec{V_i} = (x_i, y_i, z_i)i = 0 \dots 2)の和,\vec{V_e} = s\vec{V_0} + t\vec{V_1} + u\vec{V_2}で表す
  5. s, t, uが定まる場合
    • s < 0 or t < 0 or u < 0ならば,ビームはバリアの外
    • s + t + u < 1ならば,敵機はバリアの手前
  6. s, t, u不定の場合
    • ビームがバリアの一辺と平行になっている
    • 敵機がバリアの辺上にないか調べる
  7. 自機がバリア上にある場合も考え,自機と敵機を入れ替えて上記手順を行う