典型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;
    }
}


解説

観覧車の座標は、三角関数で分かります。

観覧車の座標が分かれば、
平面上での距離は、三平方の定理で分かり
見上げる角度は、タンジェントからアークタンジェントを経由して分かります。