1
0
Fork 0

Improve magnetic heading handling in MapWidget - following some testing at NZCH

This commit is contained in:
James Turner 2011-10-02 14:30:06 +01:00
parent 761644c51d
commit 465557cfa7
2 changed files with 41 additions and 16 deletions

View file

@ -397,6 +397,7 @@ MapWidget::MapWidget(int x, int y, int maxX, int maxY) :
MapWidget::~MapWidget()
{
delete _magVar;
clearData();
}
void MapWidget::setProperty(SGPropertyNode_ptr prop)
@ -535,10 +536,14 @@ void MapWidget::draw(int dx, int dy)
{
_aircraft = SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"),
fgGetDouble("/position/latitude-deg"));
_magneticHeadings = _root->getBoolValue("magnetic-headings");
if (_hasPanned)
{
bool mag = _root->getBoolValue("magnetic-headings");
if (mag != _magneticHeadings) {
clearData(); // flush cached data text, since it often includes heading
_magneticHeadings = mag;
}
if (_hasPanned) {
_root->setBoolValue("centre-on-aircraft", false);
_hasPanned = false;
}
@ -630,14 +635,9 @@ void MapWidget::paintRuler()
double dist, az, az2;
SGGeodesy::inverse(_aircraft, _clickGeod, az, az2, dist);
if (_magneticHeadings) {
az -= _magVar->get_magvar();
SG_NORMALIZE_RANGE(az, 0.0, 360.0);
}
char buffer[1024];
::snprintf(buffer, 1024, "%03d/%.1fnm",
SGMiscd::roundToInt(az), dist * SG_METER_TO_NM);
displayHeading(az), dist * SG_METER_TO_NM);
MapData* d = getOrCreateDataForKey((void*) RULER_LEGEND_KEY);
d->setLabel(buffer);
@ -1243,13 +1243,13 @@ void MapWidget::drawRunway(FGRunway* rwy)
setAnchorForKey(rwy, (p1 + p2) * 0.5);
return;
}
char buffer[1024];
::snprintf(buffer, 1024, "%s/%s\n%3.0f/%3.0f\n%.0f'",
::snprintf(buffer, 1024, "%s/%s\n%03d/%03d\n%.0f'",
rwy->ident().c_str(),
rwy->reciprocalRunway()->ident().c_str(),
rwy->headingDeg(),
rwy->reciprocalRunway()->headingDeg(),
displayHeading(rwy->headingDeg()),
displayHeading(rwy->reciprocalRunway()->headingDeg()),
rwy->lengthFt());
MapData* d = createDataForKey(rwy);
@ -1311,8 +1311,10 @@ void MapWidget::drawILS(bool tuned, FGRunway* rwy)
}
char buffer[1024];
::snprintf(buffer, 1024, "%s\n%s\n%3.2fMHz",
loc->name().c_str(), loc->ident().c_str(),loc->get_freq()/100.0);
::snprintf(buffer, 1024, "%s\n%s\n%03d - %3.2fMHz",
loc->ident().c_str(), loc->name().c_str(),
displayHeading(radial),
loc->get_freq()/100.0);
MapData* d = createDataForKey(loc);
d->setPriority(40);
@ -1680,3 +1682,23 @@ MapData* MapWidget::createDataForKey(void* key)
d->resetAge();
return d;
}
void MapWidget::clearData()
{
KeyDataMap::iterator it = _mapData.begin();
for (; it != _mapData.end(); ++it) {
delete it->second;
}
_mapData.clear();
}
int MapWidget::displayHeading(double h) const
{
if (_magneticHeadings) {
h -= _magVar->get_magvar() * SG_RADIANS_TO_DEGREES;
}
SG_NORMALIZE_RANGE(h, 0.0, 360.0);
return SGMiscd::roundToInt(h);
}

View file

@ -73,11 +73,14 @@ private:
MapData* getOrCreateDataForKey(void* key);
MapData* createDataForKey(void* key);
void setAnchorForKey(void* key, const SGVec2d& anchor);
void clearData();
SGVec2d project(const SGGeod& geod) const;
SGGeod unproject(const SGVec2d& p) const;
double currentScale() const;
int displayHeading(double trueHeading) const;
void circleAt(const SGVec2d& center, int nSides, double r);
void circleAtAlt(const SGVec2d& center, int nSides, double r, double r2);
void drawLine(const SGVec2d& p1, const SGVec2d& p2);