典型90問
次の典型90問へ
前の典型90問へ
典型90問 018 Statue of Chokudai(★3)
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("2 1 1");
WillReturn.Add("4");
WillReturn.Add("0");
WillReturn.Add("1");
WillReturn.Add("2");
WillReturn.Add("3");
//0.000000000000
//24.094842552111
//54.735610317245
//45.000000000000
}
else if (InputPattern == "Input2") {
WillReturn.Add("5121");
WillReturn.Add("312000000 4123 3314");
WillReturn.Add("6");
WillReturn.Add("123");
WillReturn.Add("12");
WillReturn.Add("445");
WillReturn.Add("4114");
WillReturn.Add("42");
WillReturn.Add("1233");
//4.322765775902
//0.421184234768
//15.640867693969
//35.396039162484
//1.475665637902
//43.338582976959
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static double mT;
static double mL;
static double mX;
static double mY;
static void Main()
{
List<string> InputList = GetInputList();
mT = double.Parse(InputList[0]);
double[] wkArr = InputList[1].Split(' ').Select(pX => double.Parse(pX)).ToArray();
mL = wkArr[0];
mX = wkArr[1];
mY = wkArr[2];
foreach (string EachStr in InputList.Skip(3)) {
double E = double.Parse(EachStr);
double Answer = Solve(E);
Console.WriteLine(Answer);
}
}
static double Solve(double pE)
{
// 円の半径
double R = mL / 2;
// 観覧車の軌跡の中点のZ座標
double MidZ = R;
// 度数法での、観覧車の角度を求める
double NewE = pE % mT;
double Deg = 360 * NewE / mT;
double Rad = DeriveRad(Deg);
// 観覧車の座標を求める
double X = 0;
double Y = -R * Math.Sin(Rad);
double Z = R - R * Math.Cos(Rad);
// 平面での距離を求める
double XDiff = Math.Abs(mX);
double YDiff = Math.Abs(mY - Y);
double Distance = Math.Sqrt(XDiff * XDiff + YDiff * YDiff);
double TanVal = Z / Distance;
double Shiita = Math.Atan(TanVal);
double Answer = Shiita * 180 / Math.PI;
return Answer;
}
// 度数法の角度をラジアンに変換
static double DeriveRad(double pDo)
{
return pDo * Math.PI / 180;
}
}
解説
観覧車の座標は、三角関数で分かります。
観覧車の座標が分かれば、
平面上での距離は、三平方の定理で分かり
見上げる角度は、タンジェントからアークタンジェントを経由して分かります。