Ref T429, functions for angle, heading and situation

* normalize angle -180/+180 when set on situation
* clamp vector function
This commit is contained in:
Klaus Basan
2018-11-09 02:26:07 +01:00
parent 985c06816b
commit 7807a05f2a
8 changed files with 89 additions and 33 deletions

View File

@@ -49,7 +49,7 @@ namespace BlackMisc
CAircraftSituation::CAircraftSituation(const CCoordinateGeodetic &position, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CElevationPlane &groundElevation)
: m_position(position), m_groundElevationPlane(groundElevation),
m_heading(heading), m_pitch(pitch), m_bank(bank),
m_heading(heading.normalizedToPlusMinus180Degrees()), m_pitch(pitch.normalizedToPlusMinus180Degrees()), m_bank(bank.normalizedToPlusMinus180Degrees()),
m_groundSpeed(gs)
{
m_pressureAltitude = position.geodeticHeight().toPressureAltitude(CPressure(1013.25, CPressureUnit::mbar()));
@@ -58,7 +58,7 @@ namespace BlackMisc
CAircraftSituation::CAircraftSituation(const CCallsign &correspondingCallsign, const CCoordinateGeodetic &position, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CElevationPlane &groundElevation)
: m_correspondingCallsign(correspondingCallsign),
m_position(position), m_groundElevationPlane(groundElevation),
m_heading(heading), m_pitch(pitch), m_bank(bank),
m_heading(heading.normalizedToPlusMinus180Degrees()), m_pitch(pitch.normalizedToPlusMinus180Degrees()), m_bank(bank.normalizedToPlusMinus180Degrees()),
m_groundSpeed(gs)
{
m_correspondingCallsign.setTypeHint(CCallsign::Aircraft);
@@ -889,6 +889,11 @@ namespace BlackMisc
return ag;
}
void CAircraftSituation::setHeading(const CHeading &heading)
{
m_heading = heading.normalizedToPlusMinus180Degrees();
}
const CLengthUnit &CAircraftSituation::getAltitudeOrDefaultUnit() const
{
if (this->getAltitude().isNull()) { return CAltitude::defaultUnit(); }
@@ -989,6 +994,16 @@ namespace BlackMisc
m_pressureAltitude = altitude;
}
void CAircraftSituation::setPitch(const CAngle &pitch)
{
m_pitch = pitch.normalizedToPlusMinus180Degrees();
}
void CAircraftSituation::setBank(const CAngle &bank)
{
m_bank = bank.normalizedToPlusMinus180Degrees();
}
void CAircraftSituation::setZeroPBH()
{
static const CAngle za(0, CAngleUnit::deg());

View File

@@ -362,7 +362,7 @@ namespace BlackMisc
const CHeading &getHeading() const { return m_heading; }
//! Set heading
void setHeading(const CHeading &heading) { m_heading = heading; }
void setHeading(const CHeading &heading);
//! Get altitude
const CAltitude &getAltitude() const { return m_position.geodeticHeight(); }
@@ -405,13 +405,13 @@ namespace BlackMisc
const PhysicalQuantities::CAngle &getPitch() const { return m_pitch; }
//! Set pitch
void setPitch(const PhysicalQuantities::CAngle &pitch) { m_pitch = pitch; }
void setPitch(const PhysicalQuantities::CAngle &pitch);
//! Get bank (angle)
const PhysicalQuantities::CAngle &getBank() const { return m_bank; }
//! Set bank (angle)
void setBank(const PhysicalQuantities::CAngle &bank) { m_bank = bank; }
void setBank(const PhysicalQuantities::CAngle &bank);
//! Set PBH values to 0 (zero)
void setZeroPBH();

View File

@@ -21,18 +21,28 @@ namespace BlackMisc
QString CHeading::convertToQString(bool i18n) const
{
static const QString s("%1 %2");
if (i18n)
{
return s.arg(CAngle::convertToQString(i18n),
this->isMagneticHeading() ?
QCoreApplication::translate("Aviation", "magnetic") :
QCoreApplication::translate("Aviation", "true"));
}
else
{
return s.arg(CAngle::convertToQString(i18n),
this->isMagneticHeading() ? "magnetic" : "true");
}
return i18n ?
s.arg(CAngle::convertToQString(i18n),
this->isMagneticHeading() ?
QCoreApplication::translate("Aviation", "magnetic") :
QCoreApplication::translate("Aviation", "true")) :
s.arg(CAngle::convertToQString(i18n),
this->isMagneticHeading() ? "magnetic" : "true");
}
void CHeading::normalizeToPlusMinus180Degrees()
{
const double v = normalizeDegrees180(this->value(CAngleUnit::deg()));
const CAngleUnit u = this->getUnit();
*this = CHeading(v, this->getReferenceNorth(), CAngleUnit::deg());
this->switchUnit(u);
}
CHeading CHeading::normalizedToPlusMinus180Degrees() const
{
CHeading copy(*this);
copy.normalizeToPlusMinus180Degrees();
return copy;
}
void CHeading::registerMetadata()

View File

@@ -87,6 +87,12 @@ namespace BlackMisc
//! Get reference north (magnetic or true)
ReferenceNorth getReferenceNorth() const { return m_north; }
//! Normalize to +- 180deg, [-179.99, 180.0]
void normalizeToPlusMinus180Degrees();
//! As [-179.99, 180.0] normalized heading
CHeading normalizedToPlusMinus180Degrees() const;
//! Register metadata
static void registerMetadata();