bool AirspaceFilterData::Match(const GeoPoint &location, const FlatProjection &projection, const AbstractAirspace &as) const { if (cls != AirspaceClass::AIRSPACECLASSCOUNT && as.GetType() != cls) return false; if (name_prefix != nullptr && !as.MatchNamePrefix(name_prefix)) return false; if (!direction.IsNegative()) { const auto closest = as.ClosestPoint(location, projection); const auto bearing = location.Bearing(closest); auto direction_error = (bearing - direction).AsDelta().AbsoluteDegrees(); if (direction_error > fixed(18)) return false; } if (!negative(distance)) { const auto closest = as.ClosestPoint(location, projection); const auto distance = location.Distance(closest); if (distance > distance) return false; } return true; }
static inline NearestAirspace CalculateNearestAirspaceHorizontal(const GeoPoint &location, const FlatProjection &projection, const AbstractAirspace &airspace) { const auto closest = airspace.ClosestPoint(location, projection); assert(closest.IsValid()); return NearestAirspace(airspace, closest.DistanceS(location)); }
AirspaceInterceptSolution AirspaceNearestSort::solve_intercept(const AbstractAirspace &a) const { if (a.Inside(m_location)) { return AirspaceInterceptSolution::Invalid(); } else { AirspaceInterceptSolution sol; sol.location = a.ClosestPoint(m_location); sol.distance = sol.location.Distance(m_location); return sol; } }
void closest(const AbstractAirspace &as) { GeoPoint c = as.ClosestPoint(state.location, projection); if (fout) { *fout << "# closest point\n"; *fout << c.longitude << " " << c.latitude << " " << "\n"; *fout << state.location.longitude << " " << state.location.latitude << " " << "\n\n"; } AirspaceInterceptSolution solution; GeoVector vec(state.location, c); vec.distance = fixed(20000); // set big distance (for testing) if (as.Intercept(state, vec.EndPoint(state.location), projection, m_perf, solution)) { if (fout) { *fout << "# intercept in " << solution.elapsed_time << " h " << solution.altitude << "\n"; } } }
static inline SoonestAirspace CalculateSoonestAirspace(const AircraftState &state, const AirspaceAircraftPerformance &perf, const double max_time, const FlatProjection &projection, const AbstractAirspace &airspace) { const auto closest = airspace.ClosestPoint(state.location, projection); assert(closest.IsValid()); const auto solution = airspace.Intercept(state, perf, closest, closest); if (!solution.IsValid() || solution.elapsed_time > max_time) return SoonestAirspace(); return SoonestAirspace(airspace, solution.elapsed_time); }
AirspaceInterceptSolution AirspaceSoonestSort::solve_intercept(const AbstractAirspace &a, const TaskProjection &projection) const { const GeoPoint loc = a.ClosestPoint(m_state.location, projection); AirspaceInterceptSolution sol = AirspaceInterceptSolution::Invalid(); bool valid = a.Intercept(m_state, m_perf, sol, loc, loc); if (sol.elapsed_time > m_max_time) { valid = false; } if (!valid) { sol.elapsed_time = fixed(-1); } return sol; }