public void Shoot_Accuracy_Create2dArray()
        {
            var sims      = 1000;
            var simulator = new ShootSimulator();
            var source    = new Position(0, 0);
            var target    = new Position(100, 0);

            var min_power = 5f;
            var max_power = 10.01f;
            var stp_power = 0.1f;

            var min_delta = 0.75f;
            var max_delta = 0.951f;
            var stp_delta = 0.05f;

            var p_size = 1 + (int)((max_power - min_power) / stp_power);
            var d_size = 1 + (int)((max_delta - min_delta) / stp_delta);

            var result = new Double[p_size, d_size];

            for (var p = 0; p < p_size; p++)
            {
                var power = p * stp_power + min_power;

                for (var d = 0; d < d_size; d++)
                {
                    var delta = d * stp_delta + min_delta;

                    var tests = new Dictionary <double, int>();

                    for (var sim = 0; sim < sims; sim++)
                    {
                        var act = simulator.Shoot(source, target, power);

                        var a = Math.Atan2(act.Y, act.X);
                        if (!tests.ContainsKey(a))
                        {
                            tests[a] = 1;
                        }
                        else
                        {
                            tests[a]++;
                        }
                    }

                    var safe = (int)(sims * delta);
                    var sum  = 0;

                    foreach (var kvp in tests.OrderBy(r => r.Key))
                    {
                        sum += kvp.Value;
                        if (sum >= safe)
                        {
                            result[p, d] = kvp.Key;
                            break;
                        }
                    }
                }
            }
            WriteAccuracy(result);
        }
		public void Shoot_Accuracy_Create2dArray()
		{
			var sims = 1000;
			var simulator = new ShootSimulator();
			var source = new Position(0, 0);
			var target = new Position(100, 0);

			var min_power = 5f;
			var max_power = 10.01f;
			var stp_power = 0.1f;

			var min_delta = 0.75f;
			var max_delta = 0.951f;
			var stp_delta = 0.05f;

			var p_size = 1 + (int)((max_power - min_power) / stp_power);
			var d_size = 1 + (int)((max_delta - min_delta) / stp_delta);

			var result = new Double[p_size, d_size];

			for (var p = 0; p < p_size; p++)
			{
				var power = p * stp_power + min_power;

				for (var d = 0; d < d_size; d++)
				{
					var delta = d * stp_delta + min_delta;

					var tests = new Dictionary<double, int>();

					for (var sim = 0; sim < sims; sim++)
					{
						var act = simulator.Shoot(source, target, power);

						var a = Math.Atan2(act.Y, act.X);
						if (!tests.ContainsKey(a))
						{
							tests[a] = 1;
						}
						else
						{
							tests[a]++;
						}
					}

					var safe = (int)(sims * delta);
					var sum = 0;

					foreach (var kvp in tests.OrderBy(r => r.Key))
					{
						sum += kvp.Value;
						if (sum >= safe)
						{
							result[p, d] = kvp.Key;
							break;
						}
					}

				}
			}
			WriteAccuracy(result);
		}