Browse Source

修正因为网站问题引起的幸存时间错误,调运任务添加幸存判断

liyang 6 months ago
parent
commit
72781b1def

+ 30 - 0
Models/SimulationCommon/SurvivalTimeModel.cs

@@ -22,6 +22,36 @@ public class SurvivalTimeModel
         float[] latitudeArray = tempNCread.latitudeArray; //纬度一维数组来源自文件'Text_readNC.cs'
         float[][][] tempArray = tempNCread.tempArray;
 
+        foreach (var item in tempArray)
+        {
+            foreach (var item1 in item)
+            {
+                for (int i = 0; i < item1.Length; i++)
+                {
+                    if (item1[i] > 60)
+                    {
+                        int index = i;
+                        while (item1[index] > 60 && index < item1.Length) {
+                            index++;
+                        }
+                        if(index < item1.Length)
+                        {
+                            item1[i] = item1[index];
+                        }
+                        else
+                        {
+                            index--;
+                            while (item1[index] > 60 && index >= 0)
+                            {
+                                index--;
+                            }
+                            item1[i] = item1[index];
+                        }
+                    }
+                }
+            }
+        }
+
         //定义NC文件中读取不到的坐标点海洋数据信息(后续可采用插值法等)
         //经度连续化
         for (int i = 0; i < longitudes - 1; i++)

+ 3 - 0
SimulationServer/Component/TaskComponent.cs

@@ -33,6 +33,9 @@ public class TaskComponent : Component
     public int seaSuccessCount = 0;
     public int landSuccessCount = 0;
 
+    public bool isSea;
+    public bool isLand;
+
     public void Start()
     {
         MHRescueMissions?.ForEach(r => r.Reset());

+ 83 - 10
SimulationServer/Entity/AircraftDY.cs

@@ -13,6 +13,7 @@ public class AircraftDY : AircraftEntity
     public bool IsOver;
     public bool Success;
     public TaskParameter taskParameter;
+    public GetNCData getNCData;
     public override void End()
     {
         TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel;
@@ -28,6 +29,16 @@ public class AircraftDY : AircraftEntity
 
     public override void Start()
     {
+        getNCData = new GetNCData();
+        getNCData.initlatitudes = FlightPlanEditor.targetpoint[0].TargetPointLatitude;
+        getNCData.initlongitudes = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
+        getNCData.GetData();
+        Text_readNC text_ReadNC = new Text_readNC();
+        text_ReadNC.initlatitudes = FlightPlanEditor.targetpoint[0].TargetPointLatitude;
+        text_ReadNC.initlongitudes = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
+        //text_ReadNC = new Text_readNC();
+        text_ReadNC.GetNCData();
+
         int hour = Convert.ToInt32(taskContent.missionInformation.StartTime.Split("时")[0]);
         //Console.WriteLine("hour:" + hour);
         double windSpeed = Convert.ToDouble(TargetQiXiangInfoSave("风速", hour));
@@ -40,15 +51,6 @@ public class AircraftDY : AircraftEntity
         FlightPlanEditor.missionpoint.MissionPointHeight = FlightPlanEditor.targetpoint[0].TargetPointHeight;
         //Console.WriteLine("Latitude:" + FlightPlanEditor.missionpoint.MissionPointLatitude + "_" + "Longitude:" + FlightPlanEditor.missionpoint.MissionPointLongitude + "_" + "Height:" + FlightPlanEditor.missionpoint.MissionPointHeight);
 
-        // 飞到目标点时间与人员存活时间做对比  有一个人活着,整个任务成功
-        //double survivalTime = SurvivalTimeModel.SurvivalTime(getNCData.tempreadNC, latitude, longitude, time, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, Days, Hour); //幸存时间
-        // 陆上搜寻预期存活时间读配置文件
-        //for (int i = 0; i < TurningPoints.Count - 1; i++) // 总飞行时间
-        //{
-        //    TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间  // 判断幸存-1
-        //}
-        // 类型只有人,其它不影响任务成功率 ,所有目标都影响识别成功率  任务准备时间 分钟 平均搜索时间 小时 平均救助时间 秒 总飞行时间 小时 第一列加单位
-
         FXJHGenerate.FromStartToMission(FlightPlanEditor, ref TurningPoints);//生成从起点到任务段起点的航路点
         // 吊运上升速度  吊运下降速度 Task文件读取 // Editor里读天气根据时间
         double resulttime = get_result_time_rope(taskParameter.Height, taskParameter.liftPersonnel, windSpeed, vis, taskParameter.liftUpSpeed, taskParameter.liftDownSpeed).time;//索滑降模型输出的索滑降时间
@@ -58,13 +60,64 @@ public class AircraftDY : AircraftEntity
         FXJHGenerate.FromMissionToEnd(FlightPlanEditor, FXJHGenerate.SuoHuaJiangMissionEndPoint(FlightPlanEditor), ref TurningPoints); 
         FXJHGenerate.FXJHTPDiedai(FlightPlanEditor, ref TurningPoints, Velocitys, FuelConsumptions);
 
+        // 飞到目标点时间与人员存活时间做对比  有一个人活着,整个任务成功
+        double time = 0;
+        for (int i = 0; i < TurningPoints.Count - 1; i++) // 总飞行时间
+        {
+            time += TurningPoints[i].SegmentFlightTime; // 总时间  // 判断幸存-1
+        }
+        isSea = true;
+        //isLand = true;
+        if (isSea)
+        {
+            if (FlightPlanEditor.targetpoint[0].TargetType.Type == "落水人员")
+            {
+                double latitude = FlightPlanEditor.targetpoint[0].TargetPointLatitude; //落水人员纬度;数据测试用
+                double longitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude; //落水人员经度,数据测试用
+                int Days;
+                int Hour;
+                int Year = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[0]);
+                int Month = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[1].Split("月")[0]);
+                int Day = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[1].Split("月")[1].Split("日")[0]);
+                Hour = Convert.ToInt32(taskContent.missionInformation.StartTime.Split("时")[0]);
+                Days = GetDaysInYear(Year, Month, Day);
+                double survivalTime = SurvivalTimeModel.SurvivalTime(getNCData.tempreadNC, latitude, longitude, time, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, Days, Hour); //幸存时间
+                Console.WriteLine("survivalTime:" + survivalTime);
+                if (survivalTime * 3600 > time)
+                {
+                    Success = true;
+                }
+                else
+                {
+                    Success = false;
+                }
+            }
+        }else if(isLand)  //陆上搜寻预期存活时间读配置文件
+        {
+            if (FlightPlanEditor.targetpoint[0].TargetType.Type == "遇险人员")
+            {
+                //Console.WriteLine("time:" + time);
+                if (FlightPlanEditor.targetpoint[0].TargetType.LiveTime > time)
+                {
+                    Success = true;
+                    //Console.WriteLine("Success:" + true);
+                }
+                else
+                {
+                    Success = false;
+                    //Console.WriteLine("Success:" + false);
+                }
+            }
+        }
+
+        // 类型只有人,其它不影响任务成功率 ,所有目标都影响识别成功率  任务准备时间 分钟 平均搜索时间 小时 平均救助时间 秒 总飞行时间 小时 第一列加单位
+
         for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间
         {
             TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间   //仿真轮次1 数值1
         }
         Console.WriteLine("TotalTime:" + TotalTime);
         IsOver = true;
-        Success = true;
         End();
     }
 
@@ -165,6 +218,26 @@ public class AircraftDY : AircraftEntity
         }
         return result;
     }
+
+    public static int GetDaysInYear(int year, int month, int day)
+    {
+        int[] daysInMonths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+        if (IsLeapYear(year))
+        {
+            daysInMonths[1] = 29;
+        }
+        int days = day;
+        for (int i = 0; i < month - 1; i++)
+        {
+            days += daysInMonths[i];
+        }
+        return days;
+    }
+
+    public static bool IsLeapYear(int year)
+    {
+        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
+    }
 }
 
 public class handling_result

+ 2 - 1
SimulationServer/Entity/AircraftEntity.cs

@@ -33,7 +33,8 @@ public class AircraftEntity : Entity
 
     public List<TurningPoint> TurningPoints = new List<TurningPoint>(); // 航路点
 
-
+    public bool isSea;
+    public bool isLand;
     public void Awake()
     {
         Db = Util.GetAircraftDefine(FlightPlanEditor.aircraftparameter.AircraftType, FlightPlanEditor.aircraftparameter.AircraftSubType, FlightPlanEditor.aircraftparameter.AircraftID);

+ 7 - 0
SimulationServer/EventHandler/CreateTaskEventHandler.cs

@@ -266,6 +266,7 @@ public class CreateSeaSJEventHandler : AEvent<CreateSeaSJTask>
     protected override UniTask Run(CreateSeaSJTask config)
     {
         var taskSys = Game.Scene.GetComponent<TaskComponent>();
+        taskSys.isSea = true;
         SeaSJRescueMission mission = ComponentFactory.Create<SeaSJRescueMission>();
         taskSys.SeaSJRescueMissions.Add(mission);
         mission.MissionId = $"海上搜索救援任务 {config.SeaSJTask.missionInformation.MissionName}";
@@ -315,6 +316,9 @@ public class CreateLandSJEventHandler : AEvent<CreateLandSXTask>
     protected override UniTask Run(CreateLandSXTask config)
     {
         var taskSys = Game.Scene.GetComponent<TaskComponent>();
+        if (taskSys.isSea)
+            return UniTask.CompletedTask; ;
+        taskSys.isLand = true;
         LandSJRescueMission mission = ComponentFactory.Create<LandSJRescueMission>();
         taskSys.LandSJRescueMissions.Add(mission);
         mission.MissionId = $"陆上搜寻救援任务 {config.LandSXTask.missionInformation.MissionName}";
@@ -399,6 +403,9 @@ public class CreateLandSJEventHandler : AEvent<CreateLandSXTask>
                     MissionEndPointHeight = targetPoint.TargetPointHeight
                 };
 
+                aircraft.isSea = taskSys.isSea;
+                aircraft.isLand = taskSys.isLand;
+
                 foreach (var item in config.KZDYTask.KZDYParameters)
                 {
                     if (item.AircraftId == aircraft.AircraftId)

+ 13 - 13
SimulationServer/EventHandler/ServerStartEventHandler.cs

@@ -118,12 +118,12 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         //}
 
         //创建空中吊运救援任务
-        //foreach (var KZDYTask in taskConfig.KZDYTasks)
-        //{
-        //    Game.EventSystem.Publish(new CreateKZDYTask
-        //    { EditorConfig = editorConfig, KZDYTask = KZDYTask });
-        //    //break;
-        //}
+        foreach (var KZDYTask in taskConfig.KZDYTasks)
+        {
+            Game.EventSystem.Publish(new CreateKZDYTask
+            { EditorConfig = editorConfig, KZDYTask = KZDYTask });
+            //break;
+        }
 
         ////创建空投空送任务
         //foreach (var KTKSTask in taskConfig.KTKSTasks)
@@ -149,13 +149,13 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         //    //break;
         //}
 
-        //创建索滑降救援任务
-        foreach (var SHJTask in taskConfig.SHJTasks)
-        {
-            Game.EventSystem.Publish(new CreateSHJTask
-            { EditorConfig = editorConfig, SHJTask = SHJTask });
-            break;
-        }
+        ////创建索滑降救援任务
+        //foreach (var SHJTask in taskConfig.SHJTasks)
+        //{
+        //    Game.EventSystem.Publish(new CreateSHJTask
+        //    { EditorConfig = editorConfig, SHJTask = SHJTask });
+        //    break;
+        //}
 
         taskSys.ExecutionContext = editorConfig.runCounts;
         taskSys.Start();