Exemple #1
0
        /// <summary>
        /// 求绕射场场强,文档公式1
        /// </summary>
        public static EField GetDiffractionEField(EField RayEFieldAtDiffractionPoint, RayInfo ray, Face diffractionFace1, Face diffractionFace2, Point diffractionPoint, Point viewPoint, double frequence)
        {
            if ((RayEFieldAtDiffractionPoint == null) || (ray == null) || (diffractionFace1 == null) || (diffractionFace2 == null) ||
                (diffractionPoint == null) || (viewPoint == null))
            {
                throw new Exception("绕射场强计算输入的参数中有参数是null");
            }
            //
            AdjacentEdge sameEdge                = new AdjacentEdge(diffractionFace1, diffractionFace2);                                                                                //获取劈边
            double       waveLength              = 300.0 / frequence;                                                                                                                   //波长
            Plural       PluralOfVerticalEField  = EField.GetVerticalE(RayEFieldAtDiffractionPoint, ray.RayVector, sameEdge.LineVector);                                                //获得电场的垂直分量
            Plural       PluralOfHorizonalEField = EField.GetHorizonalE(RayEFieldAtDiffractionPoint, ray.RayVector, sameEdge.LineVector);                                               //获得电场的水平分量
            double       Ad   = GetSpreadFactor(ray.Origin, sameEdge, diffractionPoint, viewPoint, waveLength);                                                                         //获得空间衰减的扩散因子
            double       k    = 2 * Math.PI / waveLength;                                                                                                                               //波矢量
            double       s2   = diffractionPoint.GetDistance(viewPoint);                                                                                                                //绕射点到观察点的距离
            Plural       ejks = new Plural(Math.Cos(k * s2), -Math.Sin(k * s2));                                                                                                        //exp(-jks),相位
            Plural       verticalDiffractionFactor          = GetDiffractionFactor(ray, diffractionFace1, diffractionFace2, sameEdge, diffractionPoint, viewPoint, waveLength, true);;  //垂直极化波入射时的绕射系数D
            Plural       PluralOfVerticalDiffractionEField  = Plural.PluralMultiplyDouble(PluralOfVerticalEField * verticalDiffractionFactor * ejks, Ad);                               //垂直极化波入射时的绕射场
            Plural       horizonalDiffractionFactor         = GetDiffractionFactor(ray, diffractionFace1, diffractionFace2, sameEdge, diffractionPoint, viewPoint, waveLength, false);; //水平极化波入射时的绕射系数D
            Plural       PluralOfHorizonalDiffractionEField = Plural.PluralMultiplyDouble(horizonalDiffractionFactor * PluralOfHorizonalEField * ejks, Ad);                             //水平极化波入射时的绕射场
            SpectVector  vectorOfDiffractionRay             = new SpectVector(diffractionPoint, viewPoint);                                                                             //绕射波的方向
            //垂直极化波绕射后的绕射场
            SpectVector vectorOfVerticalDiffractionEField = GetVectorOfVerticalEField(vectorOfDiffractionRay, sameEdge.LineVector);                                                     //获得电场的垂直分量的方向
            EField      verticalDiffractionEField         = GetXYZComponentOfTotalEField(PluralOfVerticalDiffractionEField, vectorOfVerticalDiffractionEField);
            //水平极化波绕射后的绕射场
            SpectVector vectorOfHorizonalDiffractionEField = GetVectorOfHorizonalEField(vectorOfDiffractionRay, sameEdge.LineVector);                                                                                                       //获得电场的水平分量的方向
            EField      horizonalDiffractionEField         = GetXYZComponentOfTotalEField(PluralOfHorizonalDiffractionEField, vectorOfHorizonalDiffractionEField);
            EField      diffractionEField = new EField(verticalDiffractionEField.X + horizonalDiffractionEField.X, verticalDiffractionEField.Y + horizonalDiffractionEField.Y, verticalDiffractionEField.Z + horizonalDiffractionEField.Z); //绕射场

            return(diffractionEField);
        }
Exemple #2
0
        static Plural Atheta(string uan, double power, Point originPoint, Point targetPoint)
        {
            //List<string> thetaGain = new List<string>();  //这四个数组的值以后从uan格式的天线文件中获取
            //List<string> phiGain = new List<string>();
            //List<string> thetaPhase = new List<string>();
            //List<string> phiPhase = new List<string>();
            //          ReadUan.GetGainPara(uan);
            Plural Atheta = new Plural();

            if (ReadUan.thetaGain.Count < 10)
            {
                return(Atheta);

                throw new Exception("Could not get the value of Antenna thetaGain!");
            }
            else
            {
                try
                {
                    int    row   = (ReadUan.GetPhiAngle(originPoint, targetPoint)) * 181 + ReadUan.GetThetaAngle(originPoint, targetPoint);
                    double A     = Math.Sqrt(60 * power * Math.Abs(Math.Pow(10, Convert.ToDouble(ReadUan.thetaGain[row]) / 10)));
                    Plural theta = new Plural(Math.Cos(Math.PI / 180 * Convert.ToDouble(ReadUan.thetaPhase[row])),
                                              Math.Sin(Math.PI / 180 * Convert.ToDouble(ReadUan.thetaPhase[row])));
                    Atheta = Plural.PluralMultiplyDouble(theta, A);
                    //Console.WriteLine("theta="+ReadUan .GetThetaAngle (originPoint ,targetPoint )+" phi="+ReadUan .GetPhiAngle (originPoint ,targetPoint ));
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
                return(Atheta);
            }
        }
Exemple #3
0
        //求得电场的xyz方向的量
        public static EField EfieldCal(string uan, double power1, double frequency, Point originPoint, Point targetPoint, Point rotateAngle = null)
        {
            double power = power1;     //传入的power1单位是dBm,转换为单位为瓦的power
            //      ReadUan.GetGainPara(uan);
            Plural Etheta = DirectEThetaCal(uan, power, frequency, originPoint, targetPoint, rotateAngle);
            Plural Ephi   = DirectEPhiCal(uan, power, frequency, originPoint, targetPoint, rotateAngle);
            //        double The = ReadUan.GetThetaAngle(originPoint, targetPoint) * Math.PI / 180.0;
            //        double Ph = ReadUan.GetPhiAngle(originPoint, targetPoint) * Math.PI / 180.0;
            EField e          = new EField();
            double thetaAngle = Convert.ToInt32(ReadUan.GetThetaAngle(originPoint, targetPoint));
            double phiAngle   = Convert.ToInt32(ReadUan.GetPhiAngle(originPoint, targetPoint));
            double Xtheta     = Math.Cos(thetaAngle * Math.PI / 180.0) * Math.Cos(phiAngle / 180 * Math.PI);
            double Xphi       = Math.Sin(ReadUan.GetPhiAngle(originPoint, targetPoint) * Math.PI / 180.0);
            double Ytheta     = Math.Cos(thetaAngle * Math.PI / 180.0) * Math.Sin(phiAngle / 180 * Math.PI);
            double Yphi       = Math.Cos(phiAngle * Math.PI / 180.0);
            double Ztheta     = Math.Sin(thetaAngle * Math.PI / 180.0);
            double Zphi       = 0;

            e.X = Plural.PluralMultiplyDouble(Etheta, Xtheta) - Plural.PluralMultiplyDouble(Ephi, Xphi);
            e.Y = Plural.PluralMultiplyDouble(Etheta, Ytheta) + Plural.PluralMultiplyDouble(Ephi, Yphi);
            e.Z = Plural.PluralMultiplyDouble(Ephi, Zphi) - Plural.PluralMultiplyDouble(Etheta, Ztheta);
            //string pathtest = "D:\\renwu\\"+DateTime.Today.ToString("yy/MM/dd")+".txt";
            //File.WriteAllText(pathtest, e.X.Re + "  " + e.X.Im + "|  " + e.Y.Re + "  " + e.Y.Im + "|  " + e.Z.Re + "  " + e.Z.Im);
            //需添加计算方法
            return(e);
        }
Exemple #4
0
        /// <summary>
        /// 将一个有方向的场强用XYZ坐标表示
        /// </summary>
        private static EField GetXYZComponentOfTotalEField(Plural totalEField, SpectVector vectorOfEField)
        {
            EField componentEField = new EField();
            double XComponent      = vectorOfEField.a / (Math.Sqrt(Math.Pow(vectorOfEField.a, 2) + Math.Pow(vectorOfEField.b, 2) + Math.Pow(vectorOfEField.c, 2)));
            double YComponent      = vectorOfEField.b / (Math.Sqrt(Math.Pow(vectorOfEField.a, 2) + Math.Pow(vectorOfEField.b, 2) + Math.Pow(vectorOfEField.c, 2)));
            double ZComponent      = vectorOfEField.c / (Math.Sqrt(Math.Pow(vectorOfEField.a, 2) + Math.Pow(vectorOfEField.b, 2) + Math.Pow(vectorOfEField.c, 2)));

            componentEField.X = Plural.PluralMultiplyDouble(totalEField, XComponent);
            componentEField.Y = Plural.PluralMultiplyDouble(totalEField, YComponent);
            componentEField.Z = Plural.PluralMultiplyDouble(totalEField, ZComponent);
            return(componentEField);
        }
Exemple #5
0
        public static EField EfieldCalSingle(string uan, double power1, double frequency, Point originPoint, Point targetPoint, Point rotateAngle = null)
        {
            double power = Math.Pow(10, (power1 - 30) / 10);     //传入的power1单位是dBm,转换为单位为瓦的power
//            ReadUan.GetGainPara(uan);

            Plural Etheta = DirectEThetaCal(uan, power, frequency, originPoint, targetPoint, rotateAngle);
            Plural Ephi   = DirectEPhiCal(uan, power, frequency, originPoint, targetPoint, rotateAngle);
            //double The = ReadUan.GetThetaAngle(originPoint, targetPoint) * Math.PI / 180.0;
            // double Ph = ReadUan.GetPhiAngle(originPoint, targetPoint) * Math.PI / 180.0;
            EField e      = new EField();
            int    Xtheta = Convert.ToInt32(Math.Cos(ReadUan.GetThetaAngle(originPoint, targetPoint) * Math.PI / 180.0) * Math.Cos(ReadUan.GetPhiAngle(originPoint, targetPoint) / 180 * Math.PI));
            double Xphi   = Convert.ToInt32(Math.Sin(ReadUan.GetPhiAngle(originPoint, targetPoint) * Math.PI / 180.0));
            double Ytheta = Convert.ToInt32(Math.Cos(ReadUan.GetThetaAngle(originPoint, targetPoint) * Math.PI / 180.0) * Math.Sin(ReadUan.GetPhiAngle(originPoint, targetPoint) / 180 * Math.PI));
            double Yphi   = Convert.ToInt32(Math.Cos(ReadUan.GetPhiAngle(originPoint, targetPoint) * Math.PI / 180.0));
            double Ztheta = Convert.ToInt32(Math.Sin(ReadUan.GetThetaAngle(originPoint, targetPoint) * Math.PI / 180.0));
            double Zphi   = 0;

            e.X = Plural.PluralMultiplyDouble(Etheta, Xtheta) - Plural.PluralMultiplyDouble(Ephi, Xphi);
            e.Y = Plural.PluralMultiplyDouble(Etheta, Ytheta) + Plural.PluralMultiplyDouble(Ephi, Yphi);
            e.Z = Plural.PluralMultiplyDouble(Ephi, Zphi) - Plural.PluralMultiplyDouble(Etheta, Ztheta);
            //需添加计算方法
            return(e);
        }
Exemple #6
0
        /// <summary>
        ///求启发式绕射系数,文档公式3,5
        /// </summary>
        private static Plural GetDiffractionFactor(RayInfo ray, Face diffractionFace1, Face diffractionFace2, AdjacentEdge sameEdge, Point diffractionPoint, Point viewPoint, double waveLength, bool judgeVerticallyPolarizedWave)
        {
            Plural D = new Plural();
            //求a1,a2
            Face rayFace            = new SpaceFace(sameEdge.StartPoint, sameEdge.EndPoint, ray.Origin);
            Face diffractionRayFace = new SpaceFace(sameEdge.StartPoint, sameEdge.EndPoint, viewPoint);
            Face frontFace          = GetTheFrontFace(diffractionFace1, diffractionFace2, rayFace, sameEdge);//先与射线相交的三角面
            Face laterFace          = diffractionFace2;

            if (frontFace != diffractionFace1)
            {
                laterFace = diffractionFace1;//后相交的三角面
            }
            double a1 = GetAngleOfTwoTers(frontFace, rayFace, sameEdge) * Math.PI / 180;
            double a2;

            if (ray.Origin.JudgeIsConcaveOrConvexToViewPoint(frontFace, diffractionRayFace))//若两个三角面的形状是凸的
            {
                double angleWithFront = GetAngleOfTwoTers(frontFace, diffractionRayFace, sameEdge);
                double angleWithLater = GetAngleOfTwoTers(laterFace, diffractionRayFace, sameEdge);
                if (angleWithFront < angleWithLater)
                {
                    a2 = angleWithFront * Math.PI / 180;
                }
                else
                {
                    a2 = (360 - angleWithFront) * Math.PI / 180;
                }
            }
            else//若两个三角面的形状是凹的
            {
                a2 = GetAngleOfTwoTers(frontFace, diffractionRayFace, sameEdge) * Math.PI / 180;
            }
            //求n
            double angleOfTwoTers = GetAngleOfTwoTers(diffractionFace1, diffractionFace2, sameEdge);
            double n = 2 - (angleOfTwoTers / 180);//n=2-a/pi,其中a为两个三角面的夹角

            //求ri
            double[] r = new double[4];
            r[0] = (Math.PI - (a2 - a1)) / (2 * n);
            r[1] = (Math.PI + (a2 - a1)) / (2 * n);
            r[2] = (Math.PI - (a2 + a1)) / (2 * n);
            r[3] = (Math.PI + (a2 + a1)) / (2 * n);
            //求k
            double k = 2 * Math.PI / waveLength;//波矢量
            //求L
            double L = GetDistanceParameter(ray.Origin, diffractionPoint, sameEdge, viewPoint, waveLength);

            //求Di
            Plural[] Di        = new Plural[4];
            Plural   minusepi4 = new Plural(-Math.Sqrt(2) / 2, Math.Sqrt(2) / 2);

            for (int i = 0; i < 4; i++)
            {
                Di[i] = Plural.PluralMultiplyDouble(minusepi4 * GetTransitionFunction(2 * k * L * Math.Pow(n, 2) * Math.Pow(Math.Sin(r[i]), 2)), 1 / (Math.Tan(r[i]) * (2 * n * Math.Sqrt(2 * k * Math.PI))));
            }
            //求反射系数R
            RayInfo diffractionRay = new RayInfo(diffractionPoint, viewPoint);

            Plural Ro = GetReflectionCoefficient(ray, frontFace, a1, waveLength, judgeVerticallyPolarizedWave);
            Plural Rn = GetReflectionCoefficient(diffractionRay, laterFace, n * Math.PI - a2, waveLength, judgeVerticallyPolarizedWave);

            D = Di[0] + Di[1] * Ro * Rn + Di[2] * Ro + Di[3] * Rn;
            return(D);
        }
Exemple #7
0
        /// <summary>
        /// 求修正Keller非一致性解的过渡函数,文档公式6
        /// </summary>
        private static Plural GetTransitionFunction(double x)
        {
            Plural Fx = new Plural();

            if ((0 <= x) && (x < 0.001))//当x在0-0.001时
            {
                double a = Math.Cos(Math.PI / 4 + Math.Pow(x, 2));
                double b = Math.Sin(Math.PI / 4 + Math.Pow(x, 2));
                Fx.Re = Math.Sqrt(Math.PI) * a * x - Math.Sqrt(2) * Math.Pow(x, 2) * a - Math.Sqrt(2) * a * Math.Pow(x, 4) / 3 + Math.Sqrt(2) * Math.Pow(x, 2) * b - Math.Sqrt(2) * b * Math.Pow(x, 4) / 3;
                Fx.Im = Math.Sqrt(2) * Math.Pow(x, 4) * a / 3 - Math.Sqrt(2) * Math.Pow(x, 2) * a + Math.Sqrt(Math.PI) * b * x - Math.Sqrt(2) * Math.Pow(x, 2) * b - Math.Sqrt(2) * Math.Pow(x, 4) * b / 3;
            }
            else if ((0.001 <= x) && (x <= 10))//当x在0.001-10之间时
            {
                Plural expi4 = new Plural(Math.Cos(Math.PI / 4 + x), Math.Sin(Math.PI / 4 + x));
                Plural ex = new Plural(Math.Cos(x), Math.Sin(x));
                double re = 0, im = 0, temp = 1;
                for (int times = 0; times < 30; times++)
                {
                    if (times != 0)
                    {
                        temp *= times;
                    }
                    if (times % 2 == 0)
                    {
                        if (times % 4 == 0)
                        {
                            re = re + (Math.Pow(x, times) * Math.Sqrt(x) / temp / (2 * times + 1));
                        }
                        else
                        {
                            re = re - (Math.Pow(x, times) * Math.Sqrt(x) / temp / (2 * times + 1));
                        }
                    }
                    else
                    {
                        if ((times + 1) % 4 == 0)
                        {
                            im = im + (Math.Pow(x, times) * Math.Sqrt(x) / temp / (2 * times + 1));
                        }
                        else
                        {
                            im = im - (Math.Pow(x, times) * Math.Sqrt(x) / temp / (2 * times + 1));
                        }
                    }
                }
                Plural integralejx2           = new Plural(re, im);
                Plural exMultiplyintegralejx2 = ex * integralejx2;
                Plural j2sqrtxMultiplyexMultiplyintegralejx2 = new Plural(-2 * Math.Sqrt(x) * exMultiplyintegralejx2.Re, 2 * Math.Sqrt(x) * exMultiplyintegralejx2.Im);
                Fx = Plural.PluralMultiplyDouble(expi4, Math.Sqrt(Math.PI * x)) - j2sqrtxMultiplyexMultiplyintegralejx2;
            }
            else if (10 < x)//当x大于10时
            {
                Fx.Re = 1 - 0.75 / Math.Pow(x, 4) + 105 / (Math.Pow(x, 8) * 16);
                Fx.Im = 0.5 / Math.Pow(x, 2) - 15 / (Math.Pow(x, 6) * 8);
            }
            else//若x小于0时
            {
                Fx = null;
            }
            return(Fx);
        }