void AbstractTask::UpdateGlideSolutions(const AircraftState &state, const GlidePolar &glide_polar) { GlideSolutionRemaining(state, glide_polar, stats.total.solution_remaining, stats.current_leg.solution_remaining); if (positive(glide_polar.GetMC())) { GlidePolar polar_mc0 = glide_polar; polar_mc0.SetMC(fixed_zero); GlideSolutionRemaining(state, polar_mc0, stats.total.solution_mc0, stats.current_leg.solution_mc0); } else { // no need to re-calculate, just copy stats.total.solution_mc0 = stats.total.solution_remaining; stats.current_leg.solution_mc0 = stats.current_leg.solution_remaining; } GlideSolutionTravelled(state, glide_polar, stats.total.solution_travelled, stats.current_leg.solution_travelled); GlideSolutionPlanned(state, glide_polar, stats.total.solution_planned, stats.current_leg.solution_planned, stats.total.remaining_effective, stats.current_leg.remaining_effective, stats.total.solution_remaining, stats.current_leg.solution_remaining); CalculatePirker(stats.total.pirker, stats.total.planned, stats.total.remaining_effective); CalculatePirker(stats.current_leg.pirker, stats.current_leg.planned, stats.current_leg.remaining_effective); Copy(stats.current_leg.remaining, stats.current_leg.solution_remaining); Copy(stats.current_leg.travelled, stats.current_leg.solution_travelled); Copy(stats.current_leg.planned, stats.current_leg.solution_planned); stats.total.gradient = ::AngleToGradient(CalcGradient(state)); stats.current_leg.gradient = ::AngleToGradient(CalcLegGradient(state)); }
fixed UnorderedTask::CalcGradient(const AircraftState &state) const { return CalcLegGradient(state); }