void WaypointAltitudeFromTerrain(WAYPOINT* Temp) { double myalt = AltitudeFromTerrain(Temp->Latitude, Temp->Longitude); if (myalt>0) { Temp->Altitude = myalt; } else { // error, can't find altitude for waypoint! } }
void UpdateTargetAltitude(TASK_POINT& TskPt) { TskPt.AATTargetAltitude = AltitudeFromTerrain(TskPt.AATTargetLat, TskPt.AATTargetLon); if(!DoOptimizeRoute() && AATEnabled) { // for AAT task, use center Alt if target point alt is less than center... TskPt.AATTargetAltitude = std::max(WayPointList[TskPt.Index].Altitude, TskPt.AATTargetAltitude); } if(TskPt.AATTargetAltitude <= 0) { TskPt.AATTargetAltitude = WayPointList[TskPt.Index].Altitude; } }
void WayPointFile::check_altitude(Waypoint &new_waypoint, const RasterTerrain *terrain, bool alt_ok) { if (terrain == NULL || alt_ok) return; // Load waypoint altitude from terrain const short t_alt = AltitudeFromTerrain(new_waypoint.Location, *terrain); if (RasterBuffer::is_special(t_alt)) { new_waypoint.Altitude = fixed_zero; } else { // TERRAIN_VALID new_waypoint.Altitude = (fixed)t_alt; } }
void PGTaskMgr::Optimize(NMEA_INFO *Basic, DERIVED_INFO *Calculated) { if (((size_t) ActiveTaskPoint) >= m_Task.size()) { return; } double w0lat = Basic->Latitude; double w0lon = Basic->Longitude; ProjPt PrevPos; LatLon2Grid(deg2rad(w0lat), deg2rad(w0lon), PrevPos.m_Y, PrevPos.m_X); double NextAltitude = Basic->Altitude; for (size_t i = ActiveTaskPoint; i < m_Task.size(); ++i) { // Calc Arrival Altitude double w1lat, w1lon; getOptimized(i, w1lat, w1lon); double Distance, Bearing; DistanceBearing(w0lat, w0lon, w1lat, w1lon, &Distance, &Bearing); double GrndAlt = AltitudeFromTerrain(w1lat, w1lon); if(NextAltitude > GrndAlt) { NextAltitude -= GlidePolar::MacCreadyAltitude( MACCREADY, Distance, Bearing, Calculated->WindSpeed, Calculated->WindBearing, 0, 0, true, 0); } if(NextAltitude < GrndAlt) { NextAltitude = GrndAlt; } // Optimize if ((i + 1) < m_Task.size()) { m_Task[i]->Optimize(PrevPos, m_Task[i + 1]->getOptimized(), NextAltitude); } else { m_Task[i]->Optimize(PrevPos, ProjPt::null, NextAltitude); } // Update previous Position for Next Loop PrevPos = m_Task[i]->getOptimized(); getOptimized(i, w0lat, w0lon); } }