static void CheckLegEqualsTotal(const GlideResult &leg, const GlideResult &total) { ok1(total.IsOk()); ok1(equals(total.height_climb, leg.height_climb)); ok1(equals(total.height_glide, leg.height_glide)); ok1(equals(total.altitude_difference, leg.altitude_difference)); ok1(equals(total.GetRequiredAltitudeWithDrift(), leg.GetRequiredAltitudeWithDrift())); }
void GlideResult::Add(const GlideResult &s2) { if ((unsigned)s2.validity > (unsigned)validity) /* downgrade the validity */ validity = s2.validity; if (!IsDefined()) return; vector.distance += s2.vector.distance; if (!IsOk()) /* the other attributes are not valid if validity is not OK or PARTIAL */ return; if (s2.GetRequiredAltitudeWithDrift() < min_arrival_altitude) { /* must meet the safety height of the first leg */ assert(s2.min_arrival_altitude < s2.GetArrivalAltitudeWithDrift(min_arrival_altitude)); /* calculate a new minimum arrival height that considers the "mountain top" in the middle */ min_arrival_altitude = s2.GetArrivalAltitudeWithDrift(min_arrival_altitude); } else { /* must meet the safety height of the second leg */ /* apply the increased altitude requirement */ altitude_difference -= s2.GetRequiredAltitudeWithDrift() - min_arrival_altitude; /* adopt the minimum height of the second leg */ min_arrival_altitude = s2.min_arrival_altitude; } pure_glide_height += s2.pure_glide_height; time_elapsed += s2.time_elapsed; height_glide += s2.height_glide; height_climb += s2.height_climb; time_virtual += s2.time_virtual; }