1
0
Fork 0

Lazy caching of magvar on waypoints. Not used yet, but soon.

This commit is contained in:
James Turner 2011-01-20 08:49:09 +00:00
parent 7cbb3a10ed
commit d227258b3b
3 changed files with 30 additions and 2 deletions

View file

@ -36,8 +36,11 @@
#include <simgear/structure/exception.hxx>
#include <simgear/xml/easyxml.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/magvar/magvar.hxx>
#include <simgear/timing/sg_time.hxx>
// FlightGear
#include <Main/globals.hxx>
#include <Navaids/procedure.hxx>
#include <Navaids/waypoint.hxx>
#include <Airports/simple.hxx>
@ -49,13 +52,16 @@ using std::fstream;
namespace flightgear {
const double NO_MAG_VAR = -1000.0; // an impossible mag-var value
Waypt::Waypt(Route* aOwner) :
_altitudeFt(0.0),
_speed(0.0),
_altRestrict(RESTRICT_NONE),
_speedRestrict(RESTRICT_NONE),
_owner(aOwner),
_flags(0)
_flags(0),
_magVarDeg(NO_MAG_VAR)
{
}
@ -127,6 +133,19 @@ Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
SGGeodesy::inverse(aPos, position(), course, az2, distance);
return std::make_pair(course, distance);
}
double Waypt::magvarDeg() const
{
if (_magVarDeg == NO_MAG_VAR) {
// derived classes with a default pos must override this method
assert(!(position() == SGGeod()));
double jd = globals->get_time_params()->getJD();
_magVarDeg = sgGetMagVar(position(), jd);
}
return _magVarDeg;
}
///////////////////////////////////////////////////////////////////////////
// persistence

View file

@ -156,6 +156,12 @@ public:
bool matches(const SGGeod& aPos) const;
virtual std::string type() const = 0;
/**
* Magentic variation at/in the vicinity of the waypoint.
* For some waypoint types this will always return 0.
*/
virtual double magvarDeg() const;
protected:
friend class NavdataVisitor;
@ -187,7 +193,7 @@ private:
Route* _owner;
unsigned short _flags;
mutable double _magVarDeg;
};
typedef std::vector<WayptRef> WayptVec;

View file

@ -206,6 +206,9 @@ public:
double headingDegMagnetic() const
{ return _magHeading; }
virtual double magvarDeg() const
{ return 0.0; }
private:
std::string _ident;
double _magHeading;