コード例 #1
0
        static void Main(string[] args)
        {
            // If we are provided starting degrees...
            if (args.Length == 4)
            {
                double northSouth = 0, eastWest = 0, anaKata = 0, strangeCharm = 0;
                try {
                    if (double.TryParse(args[0], out northSouth))
                    {
                        if (double.TryParse(args[1], out eastWest))
                        {
                            if (double.TryParse(args[2], out anaKata))
                            {
                                if (double.TryParse(args[3], out strangeCharm))
                                {
                                    Console.WriteLine("Successfully extracted variables");
                                }
                            }
                        }
                    }
                } catch (Exception e) { Console.WriteLine($"{e.Message}"); }

                _northSouth.SetDegree(northSouth);
                _eastWest.SetDegree(eastWest);
                _anaKata.SetDegree(anaKata);
                _strangeCharm.SetDegree(strangeCharm);
            }
            // For as long as we need, loop my basic input handler
            var traveling = true;

            while (traveling)
            {
                Console.Clear();
                try {
                    // Every time we are able to move, we need our current coords
                    Console.WriteLine("{0,9:0.0000}\tN/S", _northSouth.Degree);
                    Console.WriteLine("{0,9:0.0000}\tE/W", _eastWest.Degree);
                    Console.WriteLine("{0,9:0.0000}\tA/K", _anaKata.Degree);
                    Console.WriteLine("{0,9:0.0000}\tS/C", _strangeCharm.Degree);

                    /* Input is in this format:
                     * <Distance> <Angle in coordinate form> <Angle to axis plane><Axis traveled upon>
                     * <Angle for second axis of travel><Axis traveled upon>
                     *
                     * 2 vectors are ALWAYS required (even if one is 0 degrees on a coordinate plane
                     */

                    //REF: 10 45 21NA 60EC
                    //REF: 56 meters, 30 degrees North of East, 64 degrees Charm of Ana
                    // If our input was null, try again
                    var input = Console.ReadLine()
                                ?.Trim();
                    switch (input)
                    {
                    case "":
                        break;

                    case "break":
                        Environment.ExitCode = 0;
                        traveling            = false;
                        break;
                    }

                    var inputArray = new List <object> {
                    };
                    // Since each operator in the input is separated by a space, split on that to isolate variables
                    var inputs = input.Trim().Split(" ");

                    // If we can't parse the distance, the input was incorrect
                    if (!double.TryParse(inputs[0], out var distance))
                    {
                        throw new ArgumentException($"{inputs[0]} is not a valid distance");
                    }

                    if (!double.TryParse(inputs[1], out var angle))
                    {
                        throw new ArgumentException($"{inputs[1]} is not a valid angle");
                    }



                    // Since it checks out, add it to my list
                    inputArray.Add(distance);
                    inputArray.Add(angle);

                    // Now we have it, remove it from the input
                    input = input.Replace(inputs[0], "").Trim();
                    input = input.Replace(inputs[1], "").Trim();

                    // Now all we're left with is 2 directional vectors, let's do a thing with them
                    inputArray.AddRange(input.Trim().Split(" ").Select(s => new DirectionMovement(s)));


                    // Alright, time to do some trig!!!
                    var directionMovements = new List <DirectionMovement> {
                        (DirectionMovement)inputArray[2],
                        (DirectionMovement)inputArray[3]
                    };

                    var initTrig = distance * Trig.SinOfDegree(angle);

                    foreach (var directionMovement in directionMovements)
                    {
                        switch (directionMovement.Angle)
                        {
                        case "NE":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "NW":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "NA":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            Console.WriteLine($"Delta of N/S: {_northSouth.OldDegree} to {_northSouth.Degree} [{_northSouth.GetDiff()}]");
                            Console.WriteLine($"Delta of A/K: {_anaKata.OldDegree} to {_anaKata.Degree} [{_anaKata.GetDiff()}]");
                            break;

                        case "NK":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "NT":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "NC":
                            _northSouth.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "SE":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "SW":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "SA":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "SK":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "ST":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "SC":
                            _northSouth.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "EN":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "ES":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "EA":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "EK":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "ET":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "EC":
                            _eastWest.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            Console.WriteLine($"Delta of E/W: {_eastWest.OldDegree} to {_eastWest.Degree} [{_eastWest.GetDiff()}]");
                            Console.WriteLine($"Delta of T/C: {_strangeCharm.OldDegree} to {_strangeCharm.Degree} [{_strangeCharm.GetDiff()}]");
                            break;

                        case "WN":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "WS":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "WA":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "WK":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "WT":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "WC":
                            _eastWest.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AN":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AS":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AE":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AW":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AT":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "AC":
                            _anaKata.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KN":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KS":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KE":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KW":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KT":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "KC":
                            _anaKata.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _strangeCharm.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TN":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TS":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TE":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TW":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TA":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "TK":
                            _strangeCharm.AddDegree(initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CN":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CS":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _northSouth.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CE":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CW":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _eastWest.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CA":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;

                        case "CK":
                            _strangeCharm.AddDegree(-initTrig * Trig.CosOfDegree(directionMovement.Degree));
                            _anaKata.AddDegree(-initTrig * Trig.SinOfDegree(directionMovement.Degree));
                            break;
                        }
                    }

                    // Because I myself placed the variables in each slot of the List, I can do this without checking
                    Console.WriteLine($"Distance: {(double) inputArray[0]}");
                    Console.WriteLine($"Angle of movement: {(double) inputArray[1]}");
                    var angle1 = (DirectionMovement)inputArray[2];
                    var angle2 = (DirectionMovement)inputArray[3];
                    Console.WriteLine(
                        $"First direction of movement: {angle1.Degree} degrees {angle1.Angle}");
                    Console.WriteLine(
                        $"Second direction of movement: {angle2.Degree} degrees {angle2.Angle}");

                    Console.ReadKey();
                } catch (ArgumentException e) {
                    Console.WriteLine($"{e.Message}");
                }
            }

            Environment.Exit(Environment.ExitCode);
        }