mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-05 17:35:34 +08:00
Ref T397, checks on vector to find root cause NaN/inf issue
* sometimes very large numbers (xxE38) in vector * sometimes vectors which look correct, but exceed [-1,1]
This commit is contained in:
@@ -243,16 +243,24 @@ namespace BlackMisc
|
||||
|
||||
CElevationPlane CAircraftSituation::interpolatedElevation(const CAircraftSituation &situation, const CAircraftSituation &oldSituation, const CAircraftSituation &newSituation, const CLength &distance)
|
||||
{
|
||||
if (oldSituation.isNull() || newSituation.isNull()) { return CAircraftSituation::null(); }
|
||||
if (oldSituation.isNull() || newSituation.isNull()) { return CElevationPlane::null(); }
|
||||
if (!oldSituation.hasGroundElevation() || !newSituation.hasGroundElevation()) { return CElevationPlane::null(); }
|
||||
if (oldSituation.equalNormalVectorDouble(newSituation)) { return newSituation.getGroundElevationPlane(); }
|
||||
|
||||
const double newElvFt = newSituation.getGroundElevation().value(CLengthUnit::ft());
|
||||
const double oldElvFt = oldSituation.getGroundElevation().value(CLengthUnit::ft());
|
||||
const double deltaElvFt = newElvFt - oldElvFt;
|
||||
if (deltaElvFt > 25) { return CElevationPlane::null(); }
|
||||
if (deltaElvFt > MaxDeltaElevationFt) { return CElevationPlane::null(); } // threshold, interpolation not possible
|
||||
|
||||
if (!situation.isNull())
|
||||
{
|
||||
if (CBuildConfig::isLocalDeveloperDebugBuild())
|
||||
{
|
||||
Q_ASSERT_X(situation.isValidVectorRange(), Q_FUNC_INFO, "Invalid range");
|
||||
Q_ASSERT_X(oldSituation.isValidVectorRange(), Q_FUNC_INFO, "Invalid range");
|
||||
Q_ASSERT_X(newSituation.isValidVectorRange(), Q_FUNC_INFO, "Invalid range");
|
||||
}
|
||||
|
||||
const double distanceSituationNewM = situation.calculateGreatCircleDistance(newSituation).value(CLengthUnit::m());
|
||||
if (distanceSituationNewM < 5.0) { return newSituation.getGroundElevationPlane(); }
|
||||
|
||||
@@ -261,7 +269,7 @@ namespace BlackMisc
|
||||
|
||||
const double distRatio = distanceSituationNewM / distanceOldNewM;
|
||||
|
||||
// very close to the situations we return tehir elevation
|
||||
// very close to the situations we return their elevation
|
||||
if (distRatio < 0.05) { return newSituation.getGroundElevationPlane(); }
|
||||
if (distRatio > 0.95) { return oldSituation.getGroundElevationPlane(); }
|
||||
|
||||
|
||||
@@ -550,9 +550,12 @@ namespace BlackMisc
|
||||
static bool extrapolateElevation(CAircraftSituation &newSituation, const CAircraftSituation &oldSituation, const CAircraftSituation &olderSituation, const CAircraftSituationChange &oldChange);
|
||||
|
||||
//! Interpolate between the 2 situations for situation
|
||||
//! \remark NULL if there are no two elevations
|
||||
//! \remark NULL if there are no two elevations or threshold MaxDeltaElevationFt is exceeded
|
||||
static Geo::CElevationPlane interpolatedElevation(const CAircraftSituation &situation, const CAircraftSituation &oldSituation, const CAircraftSituation &newSituation, const PhysicalQuantities::CLength &distance = PhysicalQuantities::CLength::null());
|
||||
|
||||
//! Threshold until we interpolate elevations
|
||||
static constexpr double MaxDeltaElevationFt = 25.0;
|
||||
|
||||
//! Register metadata
|
||||
static void registerMetadata();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user