Esempio n. 1
0
bool
AbortTask::fill_reachable(const AIRCRAFT_STATE &state,
                          AlternateVector &approx_waypoints,
                          const GlidePolar &polar,
                          const bool only_airfield,
                          const bool final_glide)
{
  if (task_full()) {
    return false;
  }
  bool found = false;
  std::priority_queue<Alternate, AlternateVector, AlternateRank> q;
  for (AlternateVector::iterator v = approx_waypoints.begin();
       v!=approx_waypoints.end(); ) {

    if (only_airfield && !v->first.Flags.Airport) {
      ++v;
      continue;
    }
    UnorderedTaskPoint t(v->first, task_behaviour);
    const GlideResult result = TaskSolution::glide_solution_remaining(t, state, polar);
    if (is_reachable(result, final_glide)) {
      q.push(std::make_pair(v->first, result));
      // remove it since it's already in the list now      
      approx_waypoints.erase(v);

      found = true;

    } else {
      ++v;
    }
  }
  while (!q.empty() && !task_full()) {
    const Alternate top = q.top();
    tps.push_back(std::make_pair(new UnorderedTaskPoint(top.first, task_behaviour),
                                 top.second));

    const int i = tps.size()-1;
    if (tps[i].first->get_waypoint().id == active_waypoint) {
      activeTaskPoint = i;
    }

    q.pop();
  }
  return found;
}
Esempio n. 2
0
bool
AbortTask::FillReachable(const AircraftState &state,
                         AlternateVector &approx_waypoints,
                         const GlidePolar &polar, bool only_airfield,
                         bool final_glide, bool safety)
{
  if (IsTaskFull() || approx_waypoints.empty())
    return false;

  const AGeoPoint p_start(state.location, state.altitude);

  bool found_final_glide = false;
  reservable_priority_queue<Alternate, AlternateVector, AbortRank> q;
  q.reserve(32);

  for (auto v = approx_waypoints.begin(); v != approx_waypoints.end();) {
    if (only_airfield && !v->waypoint.IsAirport()) {
      ++v;
      continue;
    }

    UnorderedTaskPoint t(v->waypoint, task_behaviour);
    GlideResult result =
        TaskSolution::GlideSolutionRemaining(t, state,
                                             task_behaviour.glide, polar);

    if (IsReachable(result, final_glide)) {
      bool intersects = false;
      const bool is_reachable_final = IsReachable(result, true);

      if (intersection_test && final_glide && is_reachable_final)
        intersects = intersection_test->Intersects(
            AGeoPoint(v->waypoint.location, result.min_arrival_altitude));

      if (!intersects) {
        q.push(Alternate(v->waypoint, result));
        // remove it since it's already in the list now      
        approx_waypoints.erase(v);

        if (is_reachable_final)
          found_final_glide = true;

        continue; // skip incrementing v since we just erased it
      }
    } 

    ++v;
  }

  while (!q.empty() && !IsTaskFull()) {
    const Alternate top = q.top();
    task_points.push_back(AlternateTaskPoint(top.waypoint, task_behaviour,
                                             top.solution));

    const int i = task_points.size() - 1;
    if (task_points[i].GetWaypoint().id == active_waypoint)
      active_task_point = i;

    q.pop();
  }

  return found_final_glide;
}