Ref T773, use closest positions for average height/elevation values

Testing with XPlane:

* even in EDDF the field elevations vary from 353-368ft, which means a difference of 15ft or 4m
* that means it is important to use the closest values
This commit is contained in:
Klaus Basan
2020-03-04 00:26:43 +01:00
committed by Mat Sutcliffe
parent 57153d45d7
commit ec92b6dc46
11 changed files with 31 additions and 30 deletions

View File

@@ -611,25 +611,25 @@ namespace BlackMisc
return c;
}
CElevationPlane CAircraftSituationList::averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
CElevationPlane CAircraftSituationList::averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
{
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
const CAircraftSituationList sorted = this->findWithGeodeticMSLHeight().findWithinRange(reference, range).sortedByEuclideanDistanceSquared(reference);
if (sorted.size() < minValues) { return CElevationPlane::null(); }
QList<double> valuesInFt;
int count = 0;
for (const CAircraftSituation &situation : *this)
{
if (situation.getGroundElevationInfo() != CAircraftSituation::FromProvider) { continue; }
const bool canUse = !situation.isMoving() || (situation.isOnGroundFromNetwork() || situation.isOnGroundFromParts());
if (!canUse) { continue; }
if (!situation.isWithinRange(reference, range)) { continue; }
const double elvFt = situation.getGroundElevationPlane().getAltitude().value(CLengthUnit::ft());
valuesInFt.push_back(elvFt);
count++;
if (count > 5 && valuesInFt.size() > 3 * minValues) { break; }
if (valuesInFt.size() >= sufficientValues) { break; }
}
if (count < minValues) { return CElevationPlane::null(); }
if (valuesInFt.size() < minValues) { return CElevationPlane::null(); }
static const double MaxDevFt = CAircraftSituationChange::allowedAltitudeDeviation().value(CLengthUnit::ft());
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);