swift
Loading...
Searching...
No Matches
interpolatorlinearpbh.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
5
8#include "misc/verify.h"
9
10using namespace swift::config;
11using namespace swift::misc::aviation;
12using namespace swift::misc::physical_quantities;
13
14namespace swift::misc::simulation
15{
19 : m_simulationTimeFraction(simulationTimeFraction), m_startSituation(start), m_endSituation(end)
20 {
22 {
23 SWIFT_VERIFY_X(isValidTimeFraction(m_simulationTimeFraction), Q_FUNC_INFO,
24 "Time fraction needs to be within [0;1]");
25 }
26 }
27
28 CAngle CInterpolatorLinearPbh::interpolateAngle(const CAngle &begin, const CAngle &end, double timeFraction0to1)
29 {
30 // determine the right direction (to left, to right) we interpolate towards to
31 // -30 -> 30 => 60 (via 0)
32 // 30 -> -30 => -60 (via 0)
33 // 170 -> -170 => -340 (via 180)
34 // -170 -> 170 => 340 (via 180)
35 double deltaDeg = (end - begin).value(CAngleUnit::deg());
36 if (deltaDeg > 180.0)
37 {
38 deltaDeg -= 360;
39 }
40 else if (deltaDeg < -180.0)
41 {
42 deltaDeg += 360;
43 }
44
46 {
47 SWIFT_VERIFY_X(isAcceptableTimeFraction(timeFraction0to1), Q_FUNC_INFO, "0..1 fraction needed");
48 }
49
51 if (timeFraction0to1 >= 1.0)
52 {
53 return begin + CAngle(deltaDeg, CAngleUnit::deg());
54 }
55 if (timeFraction0to1 <= 0.0)
56 {
57 return begin;
58 }
59 return begin + CAngle(timeFraction0to1 * deltaDeg, CAngleUnit::deg());
60 }
61
63 {
64 // HINT: VTOL aircraft can change pitch/bank without changing position, planes cannot
65 // Interpolate heading: HDG = (HdgB - HdgA) * t + HdgA
66 const CHeading headingStart = m_startSituation.getHeading();
67 const CHeading headingEnd = m_endSituation.getHeading();
68
70 {
71 SWIFT_VERIFY_X(headingStart.getReferenceNorth() == headingEnd.getReferenceNorth(), Q_FUNC_INFO,
72 "Need same reference");
73 }
74 return { interpolateAngle(headingStart, headingEnd, m_simulationTimeFraction), headingEnd.getReferenceNorth() };
75 }
76
78 {
79 // Interpolate Pitch: Pitch = (PitchB - PitchA) * t + PitchA
80 return interpolateAngle(m_startSituation.getPitch(), m_endSituation.getPitch(), m_simulationTimeFraction);
81 }
82
84 {
85 // Interpolate bank: Bank = (BankB - BankA) * t + BankA
86 return interpolateAngle(m_startSituation.getBank(), m_endSituation.getBank(), m_simulationTimeFraction);
87 }
88
90 {
91 return (m_endSituation.getGroundSpeed() - m_startSituation.getGroundSpeed()) * m_simulationTimeFraction +
92 m_startSituation.getGroundSpeed();
93 }
94
96 {
98 {
99 SWIFT_VERIFY_X(isValidTimeFraction(tf), Q_FUNC_INFO, "Time fraction needs to be 0-1");
100 }
101 m_simulationTimeFraction = clampValidTimeFraction(tf);
102 }
103} // namespace swift::misc::simulation
static CAngleUnit deg()
Degrees.
Definition units.h:276
static bool isLocalDeveloperDebugBuild()
Local build for developers.
Value object encapsulating information of an aircraft's situation.
Heading as used in aviation, can be true or magnetic heading.
Definition heading.h:41
ReferenceNorth getReferenceNorth() const
Get reference north (magnetic or true).
Definition heading.h:84
Physical unit angle (radians, degrees).
Definition angle.h:23
physical_quantities::CAngle getBank() const
Getter.
physical_quantities::CSpeed getGroundSpeed() const
Getter.
physical_quantities::CAngle getPitch() const
Getter.
void setTimeFraction(double tf)
Change time fraction.
bool isValidTimeFraction(double timeFraction)
Valid time fraction [0,1].
double clampValidTimeFraction(double timeFraction)
Clamp time fraction [0,1].
T::const_iterator begin(const LockFreeReader< T > &reader)
Non-member begin() and end() for so LockFree containers can be used in ranged for loops.
Definition lockfree.h:258
T::const_iterator end(const LockFreeReader< T > &reader)
Non-member begin() and end() for so LockFree containers can be used in ranged for loops.
Definition lockfree.h:264
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.
Definition verify.h:26