refactor: Simplify interpolatePositionAndAltitude method

This commit is contained in:
Lars Toenning
2024-01-09 21:06:24 +01:00
parent 8253b73db2
commit 2cd88fa493
5 changed files with 16 additions and 24 deletions

View File

@@ -257,9 +257,12 @@ namespace BlackMisc::Simulation
currentSituation.setGroundSpeed(pbh.getGroundSpeed());
// use derived interpolant function
const bool interpolateGndFlag = pbh.getEndSituation().hasGroundDetailsForGndInterpolation() && pbh.getStartSituation().hasGroundDetailsForGndInterpolation();
currentSituation = interpolant.interpolatePositionAndAltitude(currentSituation);
const auto [interpolatedPosition, interpolatedAltitude] = interpolant.interpolatePositionAndAltitude();
currentSituation.setPosition(interpolatedPosition);
currentSituation.setAltitude(interpolatedAltitude);
currentSituation.setMSecsSinceEpoch(interpolant.getInterpolatedTime());
const bool interpolateGndFlag = pbh.getEndSituation().hasGroundDetailsForGndInterpolation() && pbh.getStartSituation().hasGroundDetailsForGndInterpolation();
if (interpolateGndFlag)
{
currentSituation.setOnGroundInfo(interpolant.interpolateGroundFactor());

View File

@@ -45,7 +45,7 @@ namespace BlackMisc::Simulation
void CInterpolatorLinear::anchor()
{}
CAircraftSituation CInterpolatorLinear::CInterpolant::interpolatePositionAndAltitude(const CAircraftSituation &situation) const
std::tuple<Geo::CCoordinateGeodetic, Aviation::CAltitude> CInterpolatorLinear::CInterpolant::interpolatePositionAndAltitude() const
{
const std::array<double, 3> startVec(m_startSituation.getPosition().normalVectorDouble());
const std::array<double, 3> endVec(m_endSituation.getPosition().normalVectorDouble());
@@ -77,12 +77,7 @@ namespace BlackMisc::Simulation
const CAltitude altitude((newAlt - oldAlt) * tf + oldAlt,
oldAlt.getReferenceDatum());
CAircraftSituation interpolatedSituation(situation);
interpolatedSituation.setPosition(interpolatedPosition);
interpolatedSituation.setAltitude(altitude);
interpolatedSituation.setMSecsSinceEpoch(this->getInterpolatedTime());
return interpolatedSituation;
return { interpolatedPosition, altitude };
}
Aviation::COnGroundInfo CInterpolatorLinear::CInterpolant::interpolateGroundFactor() const

View File

@@ -48,9 +48,8 @@ namespace BlackMisc
//! @}
//! Perform the interpolation
//! \param situation situation used as a base for interpolation. Contains for example the already interpolated PBH.
//! \return \p situation with interpolated position and altitude and updated timestamp
Aviation::CAircraftSituation interpolatePositionAndAltitude(const Aviation::CAircraftSituation &situation) const;
//! \return interpolated position and altitude
std::tuple<Geo::CCoordinateGeodetic, Aviation::CAltitude> interpolatePositionAndAltitude() const;
//! Interpolate the ground information/factor
Aviation::COnGroundInfo interpolateGroundFactor() const;

View File

@@ -315,7 +315,7 @@ namespace BlackMisc::Simulation
m_situationsAvailable = pa.size();
}
CAircraftSituation CInterpolatorSpline::CInterpolant::interpolatePositionAndAltitude(const CAircraftSituation &currentSituation) const
std::tuple<Geo::CCoordinateGeodetic, Aviation::CAltitude> CInterpolatorSpline::CInterpolant::interpolatePositionAndAltitude() const
{
const double t1 = m_pa.t[1];
const double t2 = m_pa.t[2]; // latest (adjusted)
@@ -327,7 +327,7 @@ namespace BlackMisc::Simulation
BLACK_VERIFY_X(m_currentTimeMsSinceEpoc >= t1, Q_FUNC_INFO, "invalid timestamp t1");
BLACK_VERIFY_X(m_currentTimeMsSinceEpoc < t2, Q_FUNC_INFO, "invalid timestamp t2"); // t1==t2 results in div/0
}
if (!valid) { return CAircraftSituation::null(); }
if (!valid) { return { {}, {} }; }
const double newX = evalSplineInterval(m_currentTimeMsSinceEpoc, t1, t2, m_pa.x[1], m_pa.x[2], m_pa.dx[1], m_pa.dx[2]);
const double newY = evalSplineInterval(m_currentTimeMsSinceEpoc, t1, t2, m_pa.y[1], m_pa.y[2], m_pa.dy[1], m_pa.dy[2]);
@@ -340,9 +340,8 @@ namespace BlackMisc::Simulation
BLACK_VERIFY_X(CAircraftSituation::isValidVector(m_pa.y), Q_FUNC_INFO, "invalid Y"); // all y values
BLACK_VERIFY_X(CAircraftSituation::isValidVector(m_pa.z), Q_FUNC_INFO, "invalid Z"); // all z values
}
if (!valid) { return CAircraftSituation::null(); }
if (!valid) { return { {}, {} }; }
CAircraftSituation newSituation(currentSituation);
const std::array<double, 3> normalVector = { { newX, newY, newZ } };
const CCoordinateGeodetic currentPosition(normalVector);
@@ -350,18 +349,14 @@ namespace BlackMisc::Simulation
if (!valid && CBuildConfig::isLocalDeveloperDebugBuild())
{
BLACK_VERIFY_X(valid, Q_FUNC_INFO, "invalid vector");
CLogMessage(this).warning(u"Invalid vector for '%1' v: %2 %3 %4") << currentSituation.getCallsign().asString() << normalVector[0] << normalVector[1] << normalVector[2];
CLogMessage(this).warning(u"Invalid vector v: %2 %3 %4") << normalVector[0] << normalVector[1] << normalVector[2];
}
if (!valid) { return CAircraftSituation::null(); }
if (!valid) { return { {}, {} }; }
const double newA = evalSplineInterval(m_currentTimeMsSinceEpoc, t1, t2, m_pa.a[1], m_pa.a[2], m_pa.da[1], m_pa.da[2]);
const CAltitude alt(newA, m_altitudeUnit);
newSituation.setPosition(currentPosition);
newSituation.setAltitude(alt);
newSituation.setMSecsSinceEpoch(this->getInterpolatedTime());
return newSituation;
return { currentPosition, alt };
}
Aviation::COnGroundInfo CInterpolatorSpline::CInterpolant::interpolateGroundFactor() const

View File

@@ -66,7 +66,7 @@ namespace BlackMisc::Simulation
//! Perform the interpolation
//! \param situation situation used as a base for interpolation. Contains for example the already interpolated PBH.
//! \return \p situation with interpolated position and altitude and updated timestamp
Aviation::CAircraftSituation interpolatePositionAndAltitude(const Aviation::CAircraftSituation &currentSituation) const;
std::tuple<Geo::CCoordinateGeodetic, Aviation::CAltitude> interpolatePositionAndAltitude() const;
//! Interpolate the ground information/factor
Aviation::COnGroundInfo interpolateGroundFactor() const;