FuelConsumption.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Model
  4. {
  5. public class CruiseFuelConsumptionProvider_AC313A
  6. {
  7. public static double[] fuelData = new double[] { };
  8. public static double GetCruiseFuelConsumption(double temperature, double weight, double altitude)
  9. {
  10. int index = GetCruiseIndex(temperature, weight, altitude);
  11. if (index == -1)
  12. {
  13. throw new ArgumentException("Invalid input.");
  14. }
  15. return fuelData[index];
  16. }
  17. private static int GetCruiseIndex(double temperature, double weight, double altitude)
  18. {
  19. // 根据输入的温度、重量、高度确定索引
  20. if (temperature >= 30)
  21. {
  22. if (weight < 10000) return 0;
  23. else if (weight <= 12000) return 1;
  24. else return 2;
  25. }
  26. else if (temperature >= 20 && temperature < 30)
  27. {
  28. if (weight < 10000) return 3;
  29. else if (weight <= 12000) return 4;
  30. else return 5;
  31. }
  32. else if (temperature >= 10 && temperature < 20)
  33. {
  34. if (altitude <= 4000)
  35. {
  36. if (weight < 10000) return 6;
  37. else if (weight <= 12000) return 7;
  38. else return 8;
  39. }
  40. else
  41. {
  42. if (weight < 10000) return 9;
  43. else if (weight <= 12000) return 10;
  44. else return 11;
  45. }
  46. }
  47. else if (temperature >= 0 && temperature < 10)
  48. {
  49. if (altitude <= 4000)
  50. {
  51. if (weight < 10000) return 12;
  52. else if (weight <= 12000) return 13;
  53. else return 14;
  54. }
  55. else
  56. {
  57. if (weight < 10000) return 15;
  58. else if (weight <= 12000) return 16;
  59. else return 17;
  60. }
  61. }
  62. else if (temperature >= -10 && temperature < 0)
  63. {
  64. if (altitude <= 4000)
  65. {
  66. if (weight < 10000) return 18;
  67. else if (weight <= 12000) return 19;
  68. else return 20;
  69. }
  70. else
  71. {
  72. if (weight < 10000) return 21;
  73. else if (weight <= 12000) return 22;
  74. else return 23;
  75. }
  76. }
  77. else if (temperature >= -20 && temperature < -10)
  78. {
  79. if (altitude <= 4000)
  80. {
  81. if (weight < 10000) return 24;
  82. else if (weight <= 12000) return 25;
  83. else return 26;
  84. }
  85. else
  86. {
  87. if (weight < 10000) return 27;
  88. else if (weight <= 12000) return 28;
  89. else return 29;
  90. }
  91. }
  92. else if (temperature >= -30 && temperature < -20)
  93. {
  94. if (weight < 10000) return 30;
  95. else if (weight <= 12000) return 31;
  96. else return 32;
  97. }
  98. else if (temperature < -30)
  99. {
  100. if (weight < 10000) return 33;
  101. else if (weight <= 12000) return 34;
  102. else return 35;
  103. }
  104. return -1; // 无效输入
  105. }
  106. }
  107. public class ClimbFuelConsumptionProvider_AC313A
  108. {
  109. // TODO 查询数据库
  110. private static double[] ClimbFuelData = new double[] { };
  111. public static double GetClimbFuelConsumption(double temperature, double weight, double altitude)
  112. {
  113. int index = GetClimbFlightIndex(temperature, weight, altitude);
  114. if (index == -1)
  115. {
  116. throw new ArgumentException("Invalid input.");
  117. }
  118. return ClimbFuelData[index];
  119. }
  120. private static int GetClimbFlightIndex(double temperature, double weight, double altitude)
  121. {
  122. var temperatureRanges = new List<(double, double)> { (0, 20), (20, double.MaxValue), (double.MinValue, 0) };
  123. var weightRanges = new List<(double, double)> { (double.MinValue, 10000), (10000, 12000), (12000, double.MaxValue) };
  124. var altitudeRanges = new List<(double, double)> { (double.MinValue, 1000), (1000, 2000), (2000, 3000), (3000, 4000), (4000, 5000), (5000, 6000), (6000, double.MaxValue) };
  125. int temperatureIndex = GetIndexFromRange(temperature, temperatureRanges);
  126. int weightIndex = GetIndexFromRange(weight, weightRanges);
  127. int altitudeIndex = GetIndexFromRange(altitude, altitudeRanges);
  128. if (temperatureIndex == -1 || weightIndex == -1 || altitudeIndex == -1)
  129. {
  130. return -1;
  131. }
  132. return temperatureIndex * altitudeRanges.Count * weightRanges.Count + altitudeIndex * weightRanges.Count + weightIndex;
  133. }
  134. private static int GetIndexFromRange(double value, List<(double, double)> ranges)
  135. {
  136. for (int i = 0; i < ranges.Count; i++)
  137. {
  138. if (value > ranges[i].Item1 && value <= ranges[i].Item2)
  139. {
  140. return i;
  141. }
  142. }
  143. return -1;
  144. }
  145. }
  146. public class DescentFuelConsumptionProvider_AC313A
  147. {
  148. public static double GetDescentFuelConsumption(double temperature, double weight, double altitude)
  149. {
  150. double a = CruiseFuelConsumptionProvider_AC313A.GetCruiseFuelConsumption(temperature, weight, altitude);
  151. double b = ClimbFuelConsumptionProvider_AC313A.GetClimbFuelConsumption(temperature, weight, altitude);
  152. return a - (b - a);
  153. }
  154. }
  155. public class CruiseFuelConsumptionProvider_AG600
  156. {
  157. private static double[] CruiseFuelData = new double[] { };
  158. public static double GetCruiseFuelConsumption(double temperature, double weight, double altitude)
  159. {
  160. int index = GetCruiseFlightIndex(temperature, weight, altitude);
  161. if (index == -1)
  162. {
  163. throw new ArgumentException("Invalid input.");
  164. }
  165. return CruiseFuelData[index];
  166. }
  167. private static int GetCruiseFlightIndex(double temperature, double weight, double altitude)
  168. {
  169. var weightRanges = new List<(double, double)> { (0, 30000), (30000, double.MaxValue) };
  170. var altitudeRanges = new List<(double, double)> { (0, 3000), (3000, 6000), (6000, double.MaxValue) };
  171. int weightIndex = GetIndexFromRange(weight, weightRanges);
  172. int altitudeIndex = GetIndexFromRange(altitude, altitudeRanges);
  173. if ( weightIndex == -1 || altitudeIndex == -1)
  174. {
  175. return -1;
  176. }
  177. return altitudeIndex * weightRanges.Count + weightIndex;
  178. }
  179. private static int GetIndexFromRange(double value, List<(double, double)> ranges)
  180. {
  181. for (int i = 0; i < ranges.Count; i++)
  182. {
  183. if (value > ranges[i].Item1 && value <= ranges[i].Item2)
  184. {
  185. return i;
  186. }
  187. }
  188. return -1;
  189. }
  190. }
  191. public class ClimbFuelConsumptionProvider_AG600
  192. {
  193. private static double[] ClimbFuelData = new double[] { };
  194. public static double GetClimbFuelConsumption(double temperature, double weight, double altitude)
  195. {
  196. int index = GetClimbFlightIndex(temperature, weight, altitude);
  197. if (index == -1)
  198. {
  199. throw new ArgumentException("Invalid input.");
  200. }
  201. return ClimbFuelData[index];
  202. }
  203. private static int GetClimbFlightIndex(double temperature, double weight, double altitude)
  204. {
  205. var weightRanges = new List<(double, double)> { (0, 45000), (45000, 50000), (50000, 55000), (55000, 60000), (60000, double.MaxValue) };
  206. var altitudeRanges = new List<(double, double)> { (0, 1000), (1000, 2000), (2000, 3000), (3000, 4000), (4000, 5000), (5000, 6000), (6000, 7000), (7000, 7600), (7600, double.MaxValue) };
  207. int weightIndex = GetIndexFromRange(weight, weightRanges);
  208. int altitudeIndex = GetIndexFromRange(altitude, altitudeRanges);
  209. if (weightIndex == -1 || altitudeIndex == -1)
  210. {
  211. return -1;
  212. }
  213. return altitudeIndex * weightRanges.Count + weightIndex;
  214. }
  215. private static int GetIndexFromRange(double value, List<(double, double)> ranges)
  216. {
  217. for (int i = 0; i < ranges.Count; i++)
  218. {
  219. if (value > ranges[i].Item1 && value <= ranges[i].Item2)
  220. {
  221. return i;
  222. }
  223. }
  224. return -1;
  225. }
  226. }
  227. public class DescentFuelConsumptionProvider_AG600
  228. {
  229. public static double GetDescentFuelConsumption(double temperature, double weight, double altitude)
  230. {
  231. double a = CruiseFuelConsumptionProvider_AG600.GetCruiseFuelConsumption(temperature, weight, altitude);
  232. double b = ClimbFuelConsumptionProvider_AG600.GetClimbFuelConsumption(temperature, weight, altitude);
  233. return a - (b - a);
  234. }
  235. }
  236. public class CruiseFuelConsumptionProvider_AC352
  237. {
  238. private static double[] CruiseFuelData = new double[] { };
  239. public static double GetCruiseFuelConsumption(double temperature, double weight, double altitude)
  240. {
  241. int index = GetCruiseFlightIndex(temperature, weight, altitude);
  242. if (index == -1)
  243. {
  244. throw new ArgumentException("Invalid input.");
  245. }
  246. return CruiseFuelData[index];
  247. }
  248. private static int GetCruiseFlightIndex(double temperature, double weight, double altitude)
  249. {
  250. var temperatureRanges = new List<(double, double)> { (7.5, double.MaxValue), (-7.5, 7.5), (double.MinValue, -7.5)};
  251. var weightRanges = new List<(double, double)> { (0, 6000), (6000, 7000), (7000, double.MaxValue) };
  252. var altitudeRanges = new List<(double, double)> { (0, 2000), (2000,4000), (4000, double.MaxValue) };
  253. double temperature2 = temperature + 6.5 * weight - 15;//将实际温度转换为ISA
  254. int temperatureIndex =GetIndexFromRange(temperature2, temperatureRanges);
  255. int weightIndex = GetIndexFromRange(weight, weightRanges);
  256. int altitudeIndex = GetIndexFromRange(altitude, altitudeRanges);
  257. if (temperatureIndex == -1 ||weightIndex == -1 || altitudeIndex == -1)
  258. {
  259. return -1;
  260. }
  261. return temperatureIndex * altitudeRanges.Count * weightRanges.Count + altitudeIndex * weightRanges.Count + weightIndex;
  262. }
  263. private static int GetIndexFromRange(double value, List<(double, double)> ranges)
  264. {
  265. for (int i = 0; i < ranges.Count; i++)
  266. {
  267. if (value > ranges[i].Item1 && value <= ranges[i].Item2)
  268. {
  269. return i;
  270. }
  271. }
  272. return -1;
  273. }
  274. }
  275. public class ClimbFuelConsumptionProvider_AC352
  276. {
  277. private static double[] ClimbFuelData = new double[] { };
  278. public static double GetClimbFuelConsumption(double temperature, double weight, double altitude)
  279. {
  280. int index = GetClimbFlightIndex(temperature, weight, altitude);
  281. if (index == -1)
  282. {
  283. throw new ArgumentException("Invalid input.");
  284. }
  285. return ClimbFuelData[index];
  286. }
  287. private static int GetClimbFlightIndex(double temperature, double weight, double altitude)
  288. {
  289. var temperatureRanges = new List<(double, double)> { (7.5, double.MaxValue), (-7.5, 7.5), (double.MinValue, -7.5) };
  290. var weightRanges = new List<(double, double)> { (0, 6000), (6000, 7000), (7000, double.MaxValue) };
  291. var altitudeRanges = new List<(double, double)> { (0, 1000), (1000, 2000), (2000, 3000), (3000, 4000), (4000, 4500), (4500, double.MaxValue) };
  292. int temperatureIndex = GetIndexFromRange(temperature, temperatureRanges);
  293. int weightIndex = GetIndexFromRange(weight, weightRanges);
  294. int altitudeIndex = GetIndexFromRange(altitude, altitudeRanges);
  295. if (temperatureIndex == -1 || weightIndex == -1 || altitudeIndex == -1)
  296. {
  297. return -1;
  298. }
  299. return temperatureIndex * altitudeRanges.Count * weightRanges.Count + altitudeIndex * weightRanges.Count + weightIndex;
  300. }
  301. private static int GetIndexFromRange(double value, List<(double, double)> ranges)
  302. {
  303. for (int i = 0; i < ranges.Count; i++)
  304. {
  305. if (value > ranges[i].Item1 && value <= ranges[i].Item2)
  306. {
  307. return i;
  308. }
  309. }
  310. return -1;
  311. }
  312. }
  313. public class DescentFuelConsumptionProvider_AC352
  314. {
  315. public static double GetDescentFuelConsumption(double temperature, double weight, double altitude)
  316. {
  317. double a = CruiseFuelConsumptionProvider_AC352.GetCruiseFuelConsumption(temperature, weight, altitude);
  318. double b = ClimbFuelConsumptionProvider_AC352.GetClimbFuelConsumption(temperature, weight, altitude);
  319. return a - (b - a);
  320. }
  321. }
  322. }