/// <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); }
/// <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); } }