]> git.mxchange.org Git - flightgear.git/commitdiff
Improve magnetic heading handling in MapWidget - following some testing at NZCH
authorJames Turner <zakalawe@mac.com>
Sun, 2 Oct 2011 13:30:06 +0000 (14:30 +0100)
committerJames Turner <zakalawe@mac.com>
Sun, 2 Oct 2011 13:30:06 +0000 (14:30 +0100)
src/GUI/MapWidget.cxx
src/GUI/MapWidget.hxx

index 47ec864c06fd7aec420bb99b6acea64d9c4b6131..f5d2cbd718db56dacdd921b6d569f4d9216c4469 100644 (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);
+}
index 8c3ae0b5b03d927af175dfb90424d7bf6dae3b73..3f715825060b950b8874c04049d4c5307da82895 100644 (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);