AircraftMHWithPersion.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using KYFramework;
  2. using Model;
  3. using SimulationServer.Utils;
  4. using Define = SimulationServer.Utils.Define;
  5. namespace SimulationServer;
  6. public class AircraftMHWithPersion : AircraftEntity
  7. {
  8. public string NextMissionId; // 下一个任务ID
  9. public MissionEndPoint missionEndPoint = new MissionEndPoint();
  10. public int GroundPersonnel;
  11. public int LandingPersonnel;
  12. public MHRescueMission mhRescueMission;
  13. // 频率
  14. public double Frequency = 10 * 60;
  15. public FireGround fireGround;
  16. private int InterventionNumber = 0;
  17. private double InterventionTime;//介入时间
  18. private int waterTimes = 1; // 洒水次数
  19. public override void End()
  20. {
  21. }
  22. public override void Reset()
  23. {
  24. InterventionTime = 0;
  25. InterventionNumber = 0;
  26. waterTimes = 1;
  27. base.Reset();
  28. }
  29. public override void Start()
  30. {
  31. FXJHGenerate.FromStartToMission(FlightPlanEditor,ref TurningPoints);//生成从起点到任务段起点的航路点
  32. missionEndPoint.MissionEndPointLatitude = FlightPlanEditor.missionpoint.MissionPointLatitude;
  33. missionEndPoint.MissionEndPointLongitude = FlightPlanEditor.missionpoint.MissionPointLongitude;
  34. missionEndPoint.MissionEndPointHeight = FlightPlanEditor.missionpoint.MissionPointHeight;
  35. int TransportNumber = (int)Math.Ceiling(LandingPersonnel / FlightPlanEditor.aircraftparameter.MaxPassengerNumber);
  36. int j = 0;
  37. for (int i = 0; i < TransportNumber; i ++)
  38. {
  39. if (i == 0)
  40. {
  41. FXJHGenerate.JijiangMiehuo1(FlightPlanEditor,ref TurningPoints);
  42. }
  43. else
  44. {
  45. FXJHGenerate.JijiangMiehuo(FlightPlanEditor,ref TurningPoints);
  46. j += 2;
  47. }
  48. }
  49. // FXJHGenerate.InitializeVelocities(FlightPlanEditor, TurningPoints, ref Velocitys);
  50. // FXJHGenerate.InitializeFuelConsumptions(FlightPlanEditor, TurningPoints,ref FuelConsumptions);
  51. FXJHGenerate.FromMissionToEnd(FlightPlanEditor, missionEndPoint,ref TurningPoints);
  52. FXJHGenerate.FXJHTPDiedai(FlightPlanEditor,ref TurningPoints, Velocitys, FuelConsumptions);
  53. double TravelSpeed=5;//行进速度,km/h
  54. double distance = GetDistance(FlightPlanEditor.missionpoint.MissionPointLongitude, FlightPlanEditor.firepoint[0].FirePointLongitude, FlightPlanEditor.missionpoint.MissionPointLatitude, FlightPlanEditor.firepoint[0].FirePointLatitude);
  55. double TravelTime = distance / TravelSpeed * 3600;
  56. //Log.Info("距离:" + distance);
  57. //Log.Info($"起飞准备时间: {FlightPlanEditor.aircraftparameter.TakeoffPreparationTime}");
  58. InterventionTime = 600 + TravelTime ;
  59. //Log.Info($"人走到火场的时间: {InterventionTime}");
  60. for (int i = 0;i < TransportNumber;i ++)
  61. {
  62. //Log.Info($"飞行时间{i}: {turningPoints[i].SegmentFlightTime}");
  63. InterventionTime += TurningPoints[i].SegmentFlightTime;
  64. }
  65. //Log.Info($"介入时间 {InterventionTime}");
  66. InterventionNumber = LandingPersonnel + GroundPersonnel;
  67. T = InterventionTime;
  68. TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel;
  69. T += Frequency;
  70. //Log.Info($"机降 洒水之前火场面积:" + _fireGround.countArea.burnarea);
  71. }
  72. private double GetDistance(double lon1, double lon2, double lat1, double lat2)
  73. {
  74. double R = 6371; // 地球的半径(公里)
  75. double dLat = (lat2 - lat1) * Math.PI / 180.0;
  76. double dLon = (lon2 - lon1) * Math.PI / 180.0;
  77. double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
  78. Math.Cos(lat1 * Math.PI / 180.0) * Math.Cos(lat2 * Math.PI / 180.0) *
  79. Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
  80. double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
  81. double distance = R * c;
  82. return distance;
  83. }
  84. public override void Update(double time)
  85. {
  86. if (fireGround.countArea.burnarea > 0) // 灭火完成
  87. {
  88. if (time > T)
  89. {
  90. // 开始洒水
  91. fireGround.countArea = Fire.burnCalculate(Define.WIND, mhRescueMission.slope, T, fireGround.countArea.burnarea, T, mhRescueMission.tn, fireGround.countArea.burnarea);
  92. var currentArea = Fire.groundPersonnelWater(InterventionNumber);
  93. fireGround.countArea.burnarea -= currentArea;
  94. mhRescueMission.tn = T;
  95. mhRescueMission.area += currentArea; // 有效洒水面积;
  96. Log.Info($"任务 {TaskName} 地面灭火 洒水{waterTimes} 次 本次有效洒水面积 {currentArea} 用时 {T} area {mhRescueMission.area} burnarea {fireGround.countArea.burnarea}");
  97. waterTimes++;
  98. T += Frequency;//飞机开始飞到火场 需要多少时间 t
  99. }
  100. }
  101. }
  102. }
  103. [ObjectSystem]
  104. public class AircraftMHWithPersionAwakeSystem : AwakeSystem<AircraftMHWithPersion,FlightPlanEditor>
  105. {
  106. public override void Awake(AircraftMHWithPersion self,FlightPlanEditor flightPlanEditor)
  107. {
  108. self.FlightPlanEditor = flightPlanEditor;
  109. self.Awake();
  110. self.Reset();
  111. }
  112. }