From 6596397c1e7c79fb92f9d73225d59e109fb662f4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 16 May 2019 23:56:47 +0200 Subject: [PATCH] Ref T668, update linear interpolant if new split is required --- .../simulation/interpolatorlinear.cpp | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/blackmisc/simulation/interpolatorlinear.cpp b/src/blackmisc/simulation/interpolatorlinear.cpp index ec2708e9c..e01575af5 100644 --- a/src/blackmisc/simulation/interpolatorlinear.cpp +++ b/src/blackmisc/simulation/interpolatorlinear.cpp @@ -119,9 +119,13 @@ namespace BlackMisc CAircraftSituation oldSituation = m_interpolant.getOldSituation(); CAircraftSituation newSituation = m_interpolant.getNewSituation(); - const bool recalculated = m_situationsLastModifiedUsed < m_situationsLastModified; - m_interpolant.setRecalculated(recalculated); - if (recalculated) + Q_ASSERT_X(newSituation.getAdjustedMSecsSinceEpoch() >= oldSituation.getAdjustedMSecsSinceEpoch(), Q_FUNC_INFO, "Wrong order"); + + const bool updated = m_situationsLastModifiedUsed < m_situationsLastModified; + const bool newSplit = newSituation.getAdjustedMSecsSinceEpoch() < m_currentTimeMsSinceEpoch; + const bool recalculate = updated || newSplit; + + if (recalculate) { m_situationsLastModifiedUsed = m_situationsLastModified; @@ -197,7 +201,13 @@ namespace BlackMisc // 1) values > 1 mean extrapolation // 2) values > 2 mean no new situations coming in const double distanceToSplitTimeMs = newSituation.getAdjustedMSecsSinceEpoch() - m_currentTimeMsSinceEpoch; - const double simulationTimeFraction = qMax(1.0 - (distanceToSplitTimeMs / sampleDeltaTimeMs), 0.0); + double simulationTimeFraction = qMax(1.0 - (distanceToSplitTimeMs / sampleDeltaTimeMs), 0.0); + if (simulationTimeFraction >= 1.0) + { + simulationTimeFraction = 1.0; + if (qAbs(distanceToSplitTimeMs) > 100) { CLogMessage(this).debug(u"Distance to split: %1") << distanceToSplitTimeMs; } + } + const double deltaTimeFractionMs = sampleDeltaTimeMs * simulationTimeFraction; const qint64 interpolatedTime = oldSituation.getMSecsSinceEpoch() + qRound(deltaTimeFractionMs); @@ -216,10 +226,12 @@ namespace BlackMisc log.interpolationSituations.clear(); log.interpolationSituations.push_back(oldSituation); // oldest at front log.interpolationSituations.push_back(newSituation); // latest at back - log.interpolantRecalc = recalculated; + log.interpolantRecalc = recalculate; } m_interpolant = { oldSituation, newSituation, simulationTimeFraction, interpolatedTime }; + m_interpolant.setRecalculated(recalculate); + return m_interpolant; } } // namespace