int RoutePolars::CalcGlideArrival(const AFlatGeoPoint& origin, const FlatGeoPoint& dest, const FlatProjection &proj) const { const RouteLink e(RoutePoint(dest, 0), origin, proj); return origin.altitude - CalcVHeight(e); }
GeoPoint RoutePolars::Intersection(const AGeoPoint &origin, const AGeoPoint &destination, const RasterMap *map, const FlatProjection &proj) const { if (map == nullptr || !map->IsDefined()) return GeoPoint::Invalid(); RouteLink e(RoutePoint(proj.ProjectInteger(destination), destination.altitude), RoutePoint(proj.ProjectInteger(origin), origin.altitude), proj); if (e.d <= 0) return GeoPoint::Invalid(); return map->Intersection(origin, origin.altitude - GetSafetyHeight(), CalcVHeight(e), destination, height_min_working); }
bool RoutePolars::Intersection(const AGeoPoint& origin, const AGeoPoint& destination, const RasterMap* map, const TaskProjection& proj, GeoPoint& intx) const { if (map == nullptr || !map->IsDefined()) return false; RouteLink e(RoutePoint(proj.ProjectInteger(destination), destination.altitude), RoutePoint(proj.ProjectInteger(origin), origin.altitude), proj); if (!positive(e.d)) return false; const RoughAltitude vh = CalcVHeight(e); intx = map->Intersection(origin, (short)(origin.altitude - GetSafetyHeight()), (short)vh, destination); return !(intx == destination); }
void FlatTriangleFanTree::FillGaps(const AFlatGeoPoint &origin, ReachFanParms &parms) { // worth checking for gaps? if (vs.size() > 2 && parms.rpolars.IsTurningReachEnabled()) { // now check gaps const RoutePoint o(origin, RoughAltitude(0)); RouteLink e_last(RoutePoint(*vs.begin(), RoughAltitude(0)), o, parms.task_proj); for (auto x_last = vs.cbegin(), end = vs.cend(), x = x_last + 1; x != end; x_last = x++) { if (TooClose(*x, origin) || TooClose(*x_last, origin)) continue; const RouteLink e(RoutePoint(*x, RoughAltitude(0)), o, parms.task_proj); // check if children need to be added CheckGap(origin, e_last, e, parms); e_last = e; } } }
void visit_abstract(const AbstractAirspace &as) { assert(!m_intersections.empty()); GeoPoint point = m_intersections[0].first; RouteLink l = rpolar.generate_intermediate(link.first, RoutePoint(proj.project(point), link.second.altitude), proj); if ((l.second.altitude< (short)as.get_base().Altitude) || (l.second.altitude> (short)as.get_top().Altitude)) return; if (negative(min_distance) || (l.d < min_distance)) { min_distance = l.d; nearest = std::make_pair(&as, l.second); } }
virtual void Visit(const AbstractAirspace &as) override { assert(!intersections.empty()); GeoPoint point = intersections[0].first; RouteLink l = rpolar.GenerateIntermediate(link.first, RoutePoint(proj.ProjectInteger(point), link.second.altitude), proj); if (l.second.altitude < RoughAltitude(as.GetBase().altitude) || l.second.altitude > RoughAltitude(as.GetTop().altitude)) return; if (negative(min_distance) || (l.d < min_distance)) { min_distance = l.d; nearest = std::make_pair(&as, l.second); } }
bool RoutePolars::CheckClearance(const RouteLink &e, const RasterMap* map, const FlatProjection &proj, RoutePoint& inp) const { if (!config.IsTerrainEnabled()) return true; GeoPoint int_x; int int_h; GeoPoint start = proj.Unproject(e.first); GeoPoint dest = proj.Unproject(e.second); assert(map); if (!map->FirstIntersection(start, e.first.altitude, dest, e.second.altitude, CalcVHeight(e), climb_ceiling, GetSafetyHeight(), int_x, int_h)) return true; inp = RoutePoint(proj.ProjectInteger(int_x), int_h); return false; }