namespace SimulationCommon;

public class DectionModel
{
    /// <summary>
        /// 
        /// </summary>
        /// <param name="a">光电转塔水平范围</param>
        /// <param name="f">红外探测器视场角</param>
        /// <param name="h">飞行高度</param>
        /// <param name="x">搜寻目标相对搜救力量的侧向距离</param>
        /// <param name="visibility"> 能见度(km)</param>
        /// <returns></returns>
        public static double GuangDian(double a, double f, double h, double Rx, double visibility)
        {
            double a1 = a * (Math.PI / 180);
            double f1 = f * (Math.PI / 180);
            double D = 2 * Math.Sin(a1) * h * 2 * Math.Tan(f1 / 2);
            double p = 1 - Math.Exp(-D * D / (4 * Math.PI * Rx * Rx));
            double px;
            if (visibility <= 9)
            {
                px = 0.4 * p;
            }
            else if (9 < visibility & visibility < 19)
            {
                px = 0.6 * p;
            }
            else if (19 < visibility & visibility < 28)
            {
                px = 0.8 * p;
            }
            else
            {
                px = p;
            }
            return px;
        }
        public static int GetResultGD(double px)
        {
            int result = 0;
            System.Random random = new();
            double randomNumber = random.NextDouble();
            if (px > randomNumber)
            {
                result = 1;
                return result;
            }
            return result;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="λ"></param>
        /// <param name="Si"></param>
        /// <param name="Pt"></param>
        /// <param name="Gt"></param>
        /// <param name="Gr"></param>
        /// <param name="Rx">目标距离(km)</param>
        /// <returns></returns>
        public static double Radar(double λ, double Si, double Pt, double Gt, double Gr, double Rx)
        {
            double Si1 = Math.Pow(10, (Si / 10 - 3));
            double Pt1 = Math.Pow(10, (Pt / 10 - 3));
            double Gt1 = Math.Pow(10, Pt / 10);
            double Gr1 = Math.Pow(10, Gr / 10);
            double Rmax = Math.Pow(Pt1 * Gt1 * Gr1 * λ * λ / (64 * (Math.Pow(Math.PI, 3)) * Si1), 0.25);
            double px = Math.Exp(Math.Log(Math.E, 0.000001) / (1 + 19 * Math.Pow(Rx, 4) / Math.Pow(Rmax, 4)));
            return px;
        }
        public static int GetResultRadar(double px)
        {
            int result = 0;
            System.Random random = new();
            double randomNumber = random.NextDouble();
            if (px > randomNumber)
            {
                result = 1;
                return result;
            }
            return result;
        }

}