|
@@ -618,16 +618,16 @@ ref List<TurningPoint> turningPoints)
|
|
|
fuelConsumptions[3] = GetDescentFuelConsumptionRate(editor, turningPoints[0].TurningPointHeight);
|
|
|
fuelConsumptions[4] = GetHoverFuelConsumptionRate(editor, turningPoints[2].TurningPointHeight);
|
|
|
}
|
|
|
- public static void FXJHTPDiedai(FlightPlanEditor editor,ref List<TurningPoint> turningPoints,double[] velocitys, double[] fuelConsumptions)
|
|
|
+ public static void FXJHTPDiedai(FlightPlanEditor editor, ref List<TurningPoint> turningPoints, double[] velocitys, double[] fuelConsumptions)
|
|
|
{
|
|
|
-
|
|
|
int i;
|
|
|
double DEG_TO_RAD_LOCAL = 3.1415926535897932 / 180;
|
|
|
double[] x = new double[turningPoints.Count];
|
|
|
double[] y = new double[turningPoints.Count];
|
|
|
double[] z = new double[turningPoints.Count];
|
|
|
|
|
|
- for (i = 0; i < turningPoints.Count; i++)
|
|
|
+
|
|
|
+ for (i = 0; i < turningPoints.Count; i++)
|
|
|
{
|
|
|
double lon = turningPoints[i].TurningPointLongitude * DEG_TO_RAD_LOCAL;
|
|
|
double lat = turningPoints[i].TurningPointLatitude * DEG_TO_RAD_LOCAL;
|
|
@@ -642,6 +642,7 @@ ref List<TurningPoint> turningPoints)
|
|
|
z[i] = ((b * b * N) / (a * a) + hei) * Math.Sin(lat);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
for (i = 0; i < turningPoints.Count; i++)
|
|
|
{
|
|
|
if (turningPoints[i].SegmentFlightTime == 0)
|
|
@@ -649,19 +650,14 @@ ref List<TurningPoint> turningPoints)
|
|
|
double distanceab;
|
|
|
if (i != turningPoints.Count - 1)
|
|
|
{
|
|
|
- distanceab = Math.Sqrt(Math.Pow(x[i] - x[i + 1], 2) + Math.Pow(y[i] - y[i + 1], 2) +
|
|
|
- Math.Pow(z[i] - z[i + 1], 2));
|
|
|
+ distanceab = Math.Sqrt(Math.Pow(x[i] - x[i + 1], 2) + Math.Pow(y[i] - y[i + 1], 2) + Math.Pow(z[i] - z[i + 1], 2));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- distanceab = Math.Sqrt(Math.Pow(x[i] - x[0], 2) + Math.Pow(y[i] - y[0], 2) +
|
|
|
- Math.Pow(z[i] - z[0], 2));
|
|
|
+ distanceab = Math.Sqrt(Math.Pow(x[i] - x[0], 2) + Math.Pow(y[i] - y[0], 2) + Math.Pow(z[i] - z[0], 2));
|
|
|
}
|
|
|
|
|
|
double velocity;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
switch (turningPoints[i].SegmentFlightFuelConsumption)
|
|
|
{
|
|
|
case 1:
|
|
@@ -684,69 +680,165 @@ ref List<TurningPoint> turningPoints)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
turningPoints[i].SegmentFlightTime = CalculateSegmentFlightTime(distanceab, velocity);
|
|
|
|
|
|
- double CalculateSegmentFlightTime(double distance, double velocity)
|
|
|
+ double CalculateSegmentFlightTime(double distance, double velocit)
|
|
|
{
|
|
|
- return distance * 3.6 / velocity;
|
|
|
+ return distance * 3.6 / velocit;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- turningPoints[i].SegmentFlightTime = turningPoints[i].SegmentFlightTime;
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
|
|
|
- for (i = 0; i < turningPoints.Count; i++)
|
|
|
- {
|
|
|
- double remainingFuel;
|
|
|
- if (i == 0)
|
|
|
- {
|
|
|
- remainingFuel = editor.aircraftparameter.MaxFuelCapacity * 0.8;
|
|
|
- }
|
|
|
- else
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (turningPoints[i].RemainingFuel == 0)
|
|
|
{
|
|
|
- remainingFuel = turningPoints[i - 1].RemainingFuel;
|
|
|
+ double remainingFuel;
|
|
|
+ if (i == 0)
|
|
|
+ {
|
|
|
+ remainingFuel = editor.aircraftparameter.MaxFuelCapacity * 0.8;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ remainingFuel = turningPoints[i - 1].RemainingFuel;
|
|
|
+ }
|
|
|
+
|
|
|
+ double fuelConsumption = 0;
|
|
|
+ switch (turningPoints[i].SegmentFlightFuelConsumption)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ fuelConsumption = fuelConsumptions[0];
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ fuelConsumption = fuelConsumptions[1];
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ fuelConsumption = fuelConsumptions[2];
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ fuelConsumption = fuelConsumptions[3];
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ fuelConsumption = fuelConsumptions[4];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ fuelConsumption = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ remainingFuel -= fuelConsumption * turningPoints[i].SegmentFlightTime / 3600;
|
|
|
+
|
|
|
+
|
|
|
+ turningPoints[i].RemainingFuel = remainingFuel;
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
|
|
|
- double fuelConsumption = 0;
|
|
|
-
|
|
|
- switch (turningPoints[i].SegmentFlightFuelConsumption)
|
|
|
+ if (turningPoints[i].RemainingFuel < editor.aircraftparameter.MaxFuelCapacity * 0.2 && !turningPoints[i].IsRefuelPointInserted && i < turningPoints.Count - 2)
|
|
|
{
|
|
|
- case 1:
|
|
|
- fuelConsumption = fuelConsumptions[0];
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- fuelConsumption = fuelConsumptions[1];
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- fuelConsumption = fuelConsumptions[2];
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- fuelConsumption = fuelConsumptions[3];
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- fuelConsumption = fuelConsumptions[4];
|
|
|
- break;
|
|
|
+
|
|
|
+ turningPoints[i].IsRefuelPointInserted = true;
|
|
|
+ turningPoints[i + 1].IsRefuelPointInserted = true;
|
|
|
+
|
|
|
+ TurningPoint returnToBase = new TurningPoint
|
|
|
+ {
|
|
|
+ TurningPointName = "返回基地",
|
|
|
+ TurningPointLongitude = editor.originbase.BaseLongitude,
|
|
|
+ TurningPointLatitude = editor.originbase.BaseLatitude,
|
|
|
+ TurningPointHeight = editor.originbase.BaseHeight,
|
|
|
+ TurningPointType = "返航",
|
|
|
+ SegmentFlightTime = 600,
|
|
|
+ SegmentFlightFuelConsumption = 0,
|
|
|
+ RemainingFuel = editor.aircraftparameter.MaxFuelCapacity,
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ TurningPoint refuelPoint = new TurningPoint
|
|
|
+ {
|
|
|
+ TurningPointName = "加油",
|
|
|
+ TurningPointLongitude = editor.originbase.BaseLongitude,
|
|
|
+ TurningPointLatitude = editor.originbase.BaseLatitude,
|
|
|
+ TurningPointHeight = editor.originbase.BaseHeight,
|
|
|
+ TurningPointType = "加油",
|
|
|
+ SegmentFlightTime = 0,
|
|
|
+ SegmentFlightFuelConsumption = 2,
|
|
|
+ RemainingFuel = 0,
|
|
|
+
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ TurningPoint returnToPrevious = new TurningPoint
|
|
|
+ {
|
|
|
+ TurningPointName = "返回原航路点",
|
|
|
+ TurningPointLongitude = turningPoints[i + 1].TurningPointLongitude,
|
|
|
+ TurningPointLatitude = turningPoints[i + 1].TurningPointLatitude,
|
|
|
+ TurningPointHeight = turningPoints[i + 1].TurningPointHeight,
|
|
|
+ TurningPointType = "返航",
|
|
|
+ SegmentFlightTime = 0,
|
|
|
+ SegmentFlightFuelConsumption = 2,
|
|
|
+ RemainingFuel = 0,
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ turningPoints.Insert(i + 2, returnToBase);
|
|
|
+ turningPoints.Insert(i + 3, refuelPoint);
|
|
|
+ turningPoints.Insert(i + 4, returnToPrevious);
|
|
|
+
|
|
|
+
|
|
|
+ FXJHTPDiedai(editor, ref turningPoints, velocitys, fuelConsumptions);
|
|
|
+
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
|
|
|
- remainingFuel -= fuelConsumption * turningPoints[i].SegmentFlightTime / 3600;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static double CalculateTotalFuelConsumption(FlightPlanEditor editor, List<TurningPoint> turningPoints)
|
|
|
+ {
|
|
|
+ double initialFuel = editor.aircraftparameter.MaxFuelCapacity;
|
|
|
+ double totalFuelConsumption = 0;
|
|
|
+ double totalRefuelAmount = 0;
|
|
|
+
|
|
|
+ for (int i = 0; i < turningPoints.Count; i++)
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
- if (remainingFuel < 0)
|
|
|
+
|
|
|
+ if (turningPoints[i].TurningPointType == "加油")
|
|
|
{
|
|
|
- remainingFuel = 0;
|
|
|
- break;
|
|
|
+ double refuelAmount = editor.aircraftparameter.MaxFuelCapacity - turningPoints[i - 2].RemainingFuel;
|
|
|
+ totalRefuelAmount += refuelAmount;
|
|
|
}
|
|
|
-
|
|
|
- turningPoints[i].RemainingFuel = remainingFuel;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ double finalFuel = turningPoints.Last().RemainingFuel;
|
|
|
+ totalFuelConsumption = (initialFuel + totalRefuelAmount) - finalFuel;
|
|
|
+
|
|
|
+ return totalFuelConsumption;
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
public static void CalculateTrueHeading(FlightPlanEditor editor, ref List<TurningPoint> turningPoints)
|
|
|
{
|
|
|
for (int i = 0; i < turningPoints.Count - 1; i++)
|