Пример #1
0
        /// <summary>
        ///获得处理单元及其细分单元中的射线
        /// </summary>
        /// <param name="rayTubeModels">射线管的栈</param>
        /// <param name="ter">地形</param>
        /// <param name="rxBall">接收球</param>
        ///  <param name="buildings">建筑物</param>
        /// <returns></returns>
        private List <Path> GetPathsFromRayTubeModels(Stack <RayTubeModel> rayTubeModels, Terrain ter, ReceiveBall rxBall, City buildings)
        {
            if (rayTubeModels == null || rayTubeModels.Count == 0)
            {
                LogFileManager.ObjLog.error("在追踪处理射线管模型时,输入参数为0或者空");
                return(new List <Path>());
            }
            double lengthX = ter.MaxX - ter.MinX;
            double lengthY = ter.MaxY - ter.MinY;
            List <RayTubeModel> allReachedTubes = new List <RayTubeModel>();

            while (rayTubeModels.Count != 0)
            {
                RayTubeModel paramModel = rayTubeModels.Pop();
                paramModel.UpdateTheReveivedFlag(ter, rxBall, buildings); //更新是否到达接收机标记位,并返回接收机节点,若
                if (!paramModel.IsReachingRx)                             //若没有到达接收机
                {
                    if (paramModel.HaveTraced)                            //射线管已完成与地形,建筑物的求交计算
                    {
                        this.HandleTheRayTubeModel(paramModel, rayTubeModels, lengthX, lengthY);
                    }
                    else//该处理单元还未进行与地形,建筑物的求交计算
                    {
                        paramModel.TracingThisRayTubeModel(ter, buildings);//射线求交
                        this.HandleTheRayTubeModel(paramModel, rayTubeModels, lengthX, lengthY);
                    }
                    //Console.WriteLine(rayTubeModels.Count);
                    //if (rayTubeModels.Count > 1300)
                    //{
                    //    int a = 1;
                    //}
                }
                else
                {
                    allReachedTubes.Add(paramModel);
                    if (paramModel.HaveTraced)//射线管已完成与地形,建筑物的求交计算
                    {
                        this.HandleTheRayTubeModel(paramModel, rayTubeModels, lengthX, lengthY);
                    }
                    else//该处理单元还未进行与地形,建筑物的求交计算
                    {
                        paramModel.TracingThisRayTubeModel(ter, buildings);//射线求交
                        this.HandleTheRayTubeModel(paramModel, rayTubeModels, lengthX, lengthY);
                    }
                }
            }
            List <Path> paths = this.GetReceivedPaths(allReachedTubes, rxBall);

            return(paths);
        }
Пример #2
0
        /// <summary>
        /// 获取与态势相交的射线管
        /// </summary>
        /// <param name="rayTubeModels">存放射线管的栈</param>
        /// <param name="ter">地形</param>
        /// <param name="reArea">态势区域</param>
        /// <param name="buildings">建筑物</param>
        /// <returns>按态势层的次序存放与态势层相交的射线管</returns>
        private void GetRayTubesCrossWithAreaSituation(List <RayTubeModel>[] tubesCrossWithAreaSituation, Stack <RayTubeModel> rayTubeModels, Terrain ter, ReceiveArea reArea, City buildings)
        {
            if (rayTubeModels == null || rayTubeModels.Count == 0)
            {
                LogFileManager.ObjLog.error("在追踪处理射线管模型时,输入参数为0或者空");
            }
            double lengthX = ter.MaxX - ter.MinX;
            double lengthY = ter.MaxY - ter.MinY;

            while (rayTubeModels.Count != 0)
            {
                RayTubeModel paramModel = rayTubeModels.Pop();          //从栈中抛出一个射线管进行处理
                if (!paramModel.HaveTraced)                             //判断射线管是否已完成与地形,建筑物的求交计算过程
                {
                    paramModel.TracingThisRayTubeModel(ter, buildings); //进行射线求交
                }
                //对射线管进行处理,包括是否细分、是否到达态势区域、是否满足截止条件
                this.HandleTheRayTubeModel(paramModel, rayTubeModels, reArea, tubesCrossWithAreaSituation, lengthX, lengthY);
            }
        }