018 - Statue of Chokudai (★3)
// MSVC で M_PI を使えるように
#ifdef _MSC_VER
# define _USE_MATH_DEFINES
#endif
#include < iostream>
#include < cmath> // std::sin(), std::cos(), std::hypot(), std::atan2()
#include < iomanip> // std::setprecision()
// ラジアンを度数法に変換
double ToDegree (double rad)
{
return (rad / M_PI * 180.0 );
}
int main ()
{
// T 分で一周
int T;
std::cin >> T;
// 観覧車の高さ L
int L;
std::cin >> L;
// (X, Y, 0) に像が存在
int X, Y;
std::cin >> X >> Y;
// 質問が Q 個
int Q;
std::cin >> Q;
// 観覧車の半径
const double r = (L * 0.5 );
// 観覧車の回転の角速度 (rad/分)
const double angularVelocity = (2 * M_PI) / T;
// 浮動小数点数の出力時の精度を 10 桁に
std::cout << std::setprecision (10 );
for (int i = 0 ; i < Q; ++i)
{
// E 分後
int E;
std::cin >> E;
// 観覧車の回転量 (rad)
const double angle = (angularVelocity * E);
// 乗客の Y 座標
const double y = -std::sin (angle) * r;
// 乗客の Z 座標
const double z = (-std::cos (angle) + 1.0 ) * r;
// XY 平面(地図平面)上での乗客と像の距離
const double xyDistance = std::hypot (X, Y - y);
// /|
// / |
// / | y
// / |
// /: atan2(y, x)
// /__:__|______
// x
const double aRad = std::atan2 (z, xyDistance);
// ラジアンを度数法に変換して, 解答を出力
std::cout << ToDegree (aRad) << ' \n ' ;
}
}