refs #789, fixed wrong geodetic height for onGround guessing

use null unit instead
This commit is contained in:
Klaus Basan
2016-11-11 00:53:58 +01:00
parent fbf048db4e
commit 356e91c22f
4 changed files with 19 additions and 10 deletions

View File

@@ -795,7 +795,7 @@ namespace BlackCore
const CCallsign callsign(callsignChar, CCallsign::Aircraft); const CCallsign callsign(callsignChar, CCallsign::Aircraft);
CAircraftSituation situation( CAircraftSituation situation(
callsign, callsign,
CCoordinateGeodetic(position->latitude, position->longitude, 0.0), CCoordinateGeodetic(position->latitude, position->longitude), // geodetic height -> null
CAltitude(position->altitudeTrue, CAltitude::MeanSeaLevel, CLengthUnit::ft()), CAltitude(position->altitudeTrue, CAltitude::MeanSeaLevel, CLengthUnit::ft()),
CHeading(position->heading, CHeading::True, CAngleUnit::deg()), CHeading(position->heading, CHeading::True, CAngleUnit::deg()),
CAngle(position->pitch, CAngleUnit::deg()), CAngle(position->pitch, CAngleUnit::deg()),

View File

@@ -162,7 +162,7 @@ namespace BlackMisc
bool CAircraftSituation::isOnGroundGuessed() const bool CAircraftSituation::isOnGroundGuessed() const
{ {
CLength heightAboveGround(this->getHeightAboveGround()); const CLength heightAboveGround(this->getHeightAboveGround());
if (!heightAboveGround.isNull()) if (!heightAboveGround.isNull())
{ {
return heightAboveGround.value(CLengthUnit::m()) < 1.0; return heightAboveGround.value(CLengthUnit::m()) < 1.0;
@@ -172,7 +172,7 @@ namespace BlackMisc
if (qAbs(this->getPitch().value(CAngleUnit::deg())) > 10) { return false; } if (qAbs(this->getPitch().value(CAngleUnit::deg())) > 10) { return false; }
if (qAbs(this->getBank().value(CAngleUnit::deg())) > 10) { return false; } if (qAbs(this->getBank().value(CAngleUnit::deg())) > 10) { return false; }
if (this->getGroundSpeed().value(CSpeedUnit::km_h()) > 80) { return false; } if (this->getGroundSpeed().value(CSpeedUnit::km_h()) > 75) { return false; }
// not sure, but this is a guess // not sure, but this is a guess
return true; return true;
@@ -186,9 +186,10 @@ namespace BlackMisc
// we have a sure value // we have a sure value
return this->getAltitude(); return this->getAltitude();
} }
if (!m_position.geodeticHeight().isNull() && !m_altitude.isNull()) const CLength gh(geodeticHeight());
if (!gh.isNull() && !m_altitude.isNull())
{ {
return m_altitude - m_position.geodeticHeight(); return m_altitude - gh;
} }
return notAvialable; return notAvialable;
} }

View File

@@ -190,13 +190,19 @@ namespace BlackMisc
} }
} }
CCoordinateGeodetic::CCoordinateGeodetic(CLatitude latitude, CLongitude longitude, BlackMisc::PhysicalQuantities::CLength height) : CCoordinateGeodetic::CCoordinateGeodetic(CLatitude latitude, CLongitude longitude, BlackMisc::PhysicalQuantities::CLength geodeticHeight) :
m_x(latitude.cos() * longitude.cos()), m_x(latitude.cos() * longitude.cos()),
m_y(latitude.cos() * longitude.sin()), m_y(latitude.cos() * longitude.sin()),
m_z(latitude.sin()), m_z(latitude.sin()),
m_geodeticHeight(height) m_geodeticHeight(geodeticHeight)
{} {}
CCoordinateGeodetic::CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees) :
CCoordinateGeodetic( { latitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { longitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { 0.0, BlackMisc::PhysicalQuantities::CLengthUnit::nullUnit() }) {}
CCoordinateGeodetic::CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees, double heightMeters) :
CCoordinateGeodetic( { latitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { longitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { heightMeters, BlackMisc::PhysicalQuantities::CLengthUnit::m() }) {}
CLatitude CCoordinateGeodetic::latitude() const CLatitude CCoordinateGeodetic::latitude() const
{ {
return { std::atan2(m_z, std::hypot(m_x, m_y)), PhysicalQuantities::CAngleUnit::rad() }; return { std::atan2(m_z, std::hypot(m_x, m_y)), PhysicalQuantities::CAngleUnit::rad() };

View File

@@ -180,11 +180,13 @@ namespace BlackMisc
CCoordinateGeodetic(const QVector3D &normal) : m_x(normal.x()), m_y(normal.y()), m_z(normal.z()) {} CCoordinateGeodetic(const QVector3D &normal) : m_x(normal.x()), m_y(normal.y()), m_z(normal.z()) {}
//! Constructor by values //! Constructor by values
CCoordinateGeodetic(CLatitude latitude, CLongitude longitude, BlackMisc::PhysicalQuantities::CLength height); CCoordinateGeodetic(CLatitude latitude, CLongitude longitude, BlackMisc::PhysicalQuantities::CLength geodeticHeight);
//! Constructor by double values, but no geodetic height
CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees);
//! Constructor by values //! Constructor by values
CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees, double heightMeters) : CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees, double heightMeters);
CCoordinateGeodetic( { latitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { longitudeDegrees, BlackMisc::PhysicalQuantities::CAngleUnit::deg() }, { heightMeters, BlackMisc::PhysicalQuantities::CLengthUnit::m() }) {}
//! \copydoc ICoordinateGeodetic::latitude //! \copydoc ICoordinateGeodetic::latitude
virtual CLatitude latitude() const override; virtual CLatitude latitude() const override;