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); }
RouteLink RoutePolars::GenerateIntermediate(const RoutePoint& _dest, const RoutePoint& _origin, const FlatProjection &proj) const { RouteLink link(_dest, _origin, proj); const int vh = CalcVHeight(link) + _dest.altitude; if (CanClimb()) link.second.altitude = std::max(_dest.altitude, std::min(vh, cruise_altitude)); else link.second.altitude = vh; return link; }
bool RoutePolars::IsAchievable(const RouteLink& link, const bool check_ceiling) const { if (CanClimb()) return true; if (check_ceiling && config.use_ceiling && link.second.altitude > climb_ceiling) return false; return link.second.altitude <= cruise_altitude && link.second.altitude - link.first.altitude >= CalcVHeight(link); }
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); }
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; }