#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>
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)
{
}
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
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;
Route* _owner;
unsigned short _flags;
-
+ mutable double _magVarDeg;
};
typedef std::vector<WayptRef> WayptVec;