const Airspaces::AirspaceVector Airspaces::scan_range(const GeoPoint &location, const fixed range, const AirspacePredicate &condition) const { if (empty()) return AirspaceVector(); // nothing to do Airspace bb_target(location, task_projection); int mrange = task_projection.project_range(location, range); std::deque< Airspace > vectors; airspace_tree.find_within_range(bb_target, -mrange, std::back_inserter(vectors)); #ifdef INSTRUMENT_TASK n_queries++; #endif AirspaceVector res; for (auto v = vectors.begin(); v != vectors.end(); ++v) { if (!condition(*v->get_airspace())) continue; if (fixed((*v).Distance(bb_target)) > range) continue; if ((*v).inside(location) || positive(range)) res.push_back(*v); } return res; }
const Airspaces::AirspaceVector Airspaces::ScanRange(const GeoPoint &location, fixed range, const AirspacePredicate &condition) const { if (empty()) // nothing to do return AirspaceVector(); Airspace bb_target(location, task_projection); int projected_range = task_projection.ProjectRangeInteger(location, range); std::deque< Airspace > vectors; airspace_tree.find_within_range(bb_target, -projected_range, std::back_inserter(vectors)); #ifdef INSTRUMENT_TASK n_queries++; #endif AirspaceVector res; for (const auto &v : vectors) { if (!condition(*v.GetAirspace())) continue; if (fixed(v.Distance(bb_target)) > range) continue; if (v.IsInside(location) || positive(range)) res.push_back(v); } return res; }
const Airspaces::AirspaceVector Airspaces::scan_nearest(const GeoPoint &location, const AirspacePredicate &condition) const { if (empty()) return AirspaceVector(); // nothing to do Airspace bb_target(location, task_projection); std::pair<AirspaceTree::const_iterator, AirspaceTree::distance_type> found = airspace_tree.find_nearest(bb_target); #ifdef INSTRUMENT_TASK n_queries++; #endif AirspaceVector res; if (found.first != airspace_tree.end()) { // also should do scan_range with range = 0 since there // could be more than one with zero dist if (found.second.is_zero()) { return scan_range(location, fixed_zero, condition); } else { if (condition(*found.first->get_airspace())) res.push_back(*found.first); } } return res; }
const Airspaces::AirspaceVector Airspaces::ScanRange(const GeoPoint &location, fixed range, const AirspacePredicate &condition) const { if (IsEmpty()) // nothing to do return AirspaceVector(); Airspace bb_target(location, task_projection); int projected_range = task_projection.ProjectRangeInteger(location, range); #ifdef INSTRUMENT_TASK n_queries++; #endif AirspaceVector res; std::function<void(const Airspace &)> visitor = [&location, range, &condition, &bb_target, &res](const Airspace &v){ if (condition(v.GetAirspace()) && fixed(v.Distance(bb_target)) <= range && (v.IsInside(location) || positive(range))) res.push_back(v); }; airspace_tree.visit_within_range(bb_target, -projected_range, visitor); return res; }