AircraftZS.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using KYFramework;
  2. using KYFramework.Network;
  3. using Model;
  4. using SimulationServer.Utils;
  5. using Define = SimulationServer.Utils.Define;
  6. namespace SimulationServer;
  7. public class AircraftZS : AircraftEntity
  8. {
  9. public string NextMissionId; // 下一个任务ID
  10. public MissionEndPoint missionEndPoint = new MissionEndPoint();
  11. public int LandingPersonnel; //personCount
  12. public MHRescueMission mhRescueMission;
  13. public int 单次救援人数 = 80; // 任务文件读取
  14. public int 观察盘旋圈数 = 3; //任务文件读取
  15. public int landingPoint = 0;
  16. public List<Model.AirRoute> airRoutes = new List<Model.AirRoute>();
  17. public ZSJYTask taskContent;
  18. public TaskParameter taskParameter;
  19. public bool IsOver;
  20. public bool Success;
  21. public override void End()
  22. {
  23. TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel;
  24. }
  25. public override void Reset()
  26. {
  27. base.Reset();
  28. IsOver = false;
  29. Success = false;
  30. TotalTime = 0;
  31. }
  32. public override void Start()
  33. {
  34. FlightPlanEditor.missionpoint.MissionPointLatitude = FlightPlanEditor.targetpoint[0].TargetPointLatitude;
  35. FlightPlanEditor.missionpoint.MissionPointLongitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
  36. FlightPlanEditor.missionpoint.MissionPointHeight = FlightPlanEditor.targetpoint[0].TargetPointHeight;
  37. //Console.WriteLine("MissionPointLatitude:" + FlightPlanEditor.missionpoint.MissionPointLatitude);
  38. int count = 0;
  39. foreach (var item in taskContent.ZSJYParameters)
  40. {
  41. //Console.WriteLine("item.AircraftId:" + item.AircraftId);
  42. //Console.WriteLine("FlightPlanEditor.aircraftparameter.AircraftID:" + FlightPlanEditor.aircraftparameter.Id);
  43. if (item.AircraftId == FlightPlanEditor.aircraftparameter.Id)
  44. {
  45. double a = (double)taskContent.missionInformation.TaskEndConditions.person_number_Rescue;
  46. double b = (double)item.RescuePersonnel;
  47. count = (int)Math.Ceiling(a / b);
  48. //Console.WriteLine("count:" + count);
  49. }
  50. }
  51. for (int j = 0; j < count; j++)
  52. {
  53. FXJHGenerate.FromStartToMission(FlightPlanEditor, ref TurningPoints);//生成从起点到任务段起点的航路点
  54. missionEndPoint.MissionEndPointLatitude = FlightPlanEditor.targetpoint[0].TargetPointLatitude;
  55. missionEndPoint.MissionEndPointLongitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
  56. missionEndPoint.MissionEndPointHeight = FlightPlanEditor.targetpoint[0].TargetPointHeight;
  57. airRoutes.Clear();
  58. List<double> list = GenerateCircleTrajectory(FlightPlanEditor.targetpoint[0].TargetPointLatitude, FlightPlanEditor.targetpoint[0].TargetPointLongitude, 1, 360);
  59. //airRoutes = list
  60. Model.AirRoute airRoute = new Model.AirRoute();
  61. for (int i = 0; i < list.Count; i++)
  62. {
  63. if (i % 2 == 0)
  64. {
  65. //Console.WriteLine("i0:" + list[i]);
  66. airRoute = new Model.AirRoute();
  67. airRoute.AirRouteLongitude = list[i];
  68. }
  69. else
  70. {
  71. //Console.WriteLine("i1:" + list[i]);
  72. airRoute.AirRouteLatitude = list[i];
  73. airRoutes.Add(airRoute);
  74. }
  75. }
  76. for (int i = 0; i < taskParameter.TurnsNumber; i++)
  77. {
  78. FXJHGenerate.ZhaoShuiJiuYuan(airRoutes, ref TurningPoints);
  79. }
  80. FXJHGenerate.ZhaoShuiJiuYuan1(airRoutes, ref TurningPoints);
  81. FXJHGenerate.FromMissionToEnd(FlightPlanEditor, missionEndPoint, ref TurningPoints);
  82. }
  83. // FXJHGenerate.InitializeVelocities(FlightPlanEditor, TurningPoints, ref Velocitys);
  84. // FXJHGenerate.InitializeFuelConsumptions(FlightPlanEditor, TurningPoints,ref FuelConsumptions);
  85. FXJHGenerate.FXJHTPDiedai(FlightPlanEditor, ref TurningPoints, Velocitys, FuelConsumptions); // 更新了 计算油耗的方法
  86. for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间
  87. {
  88. TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间 //仿真轮次1 数值1
  89. //Console.WriteLine("TotalTime:" + TotalTime);
  90. }
  91. Console.WriteLine("TotalTime:" + TotalTime);
  92. IsOver = true;
  93. //Success = true; //需要判断
  94. End();
  95. }
  96. // centerLat centerLon 想定里目标点的经纬度 radiusKm = 1 numPoints = 360 返回的airRoutes //
  97. // 生成圆形轨迹点,并以 double 列表形式返回(按经度-纬度顺序存储)
  98. public static List<double> GenerateCircleTrajectory(double centerLat, double centerLon, double radiusKm, int numPoints)
  99. {
  100. var points = new List<double>();
  101. double earthRadius = 6371.0; // 地球半径,单位:公里
  102. for (int i = 0; i < numPoints; i++)
  103. {
  104. double angle = 2 * Math.PI * i / numPoints; // 当前点的角度(弧度)
  105. // 计算偏移量
  106. double offsetLat = radiusKm / earthRadius; // 纬度的偏移量(弧度)
  107. double offsetLon = offsetLat / Math.Cos(ToRadians(centerLat)); // 经度的偏移量(弧度)
  108. // 计算该角度下的点的经纬度
  109. double newLat = centerLat + ToDegrees(offsetLat * Math.Cos(angle));
  110. double newLon = centerLon + ToDegrees(offsetLon * Math.Sin(angle));
  111. // 按经度在前,纬度在后顺序存储
  112. points.Add(newLon);
  113. points.Add(newLat);
  114. }
  115. return points;
  116. }
  117. // 弧度转换为角度
  118. static double ToDegrees(double radians)
  119. {
  120. return radians * 180.0 / Math.PI;
  121. }
  122. // 角度转换为弧度
  123. static double ToRadians(double degrees)
  124. {
  125. return degrees * Math.PI / 180.0;
  126. }
  127. //private double GetDistance(double lon1, double lon2, double lat1, double lat2)
  128. //{
  129. // double R = 6371; // 地球的半径(公里)
  130. // double dLat = (lat2 - lat1) * Math.PI / 180.0;
  131. // double dLon = (lon2 - lon1) * Math.PI / 180.0;
  132. // double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
  133. // Math.Cos(lat1 * Math.PI / 180.0) * Math.Cos(lat2 * Math.PI / 180.0) *
  134. // Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
  135. // double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
  136. // double distance = R * c;
  137. // return distance;
  138. //}
  139. public override void Update(double time)
  140. {
  141. }
  142. }
  143. [ObjectSystem]
  144. public class AircraftZSAwakeSystem : AwakeSystem<AircraftZS, FlightPlanEditor>
  145. {
  146. public override void Awake(AircraftZS self, FlightPlanEditor flightPlanEditor)
  147. {
  148. self.FlightPlanEditor = flightPlanEditor;
  149. self.Awake();
  150. //self.Reset();
  151. }
  152. }