X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FMapWidget.cxx;h=e92e7106dcdced946450a35910486636aac7ed6b;hb=6dd47822545bf27f69a18a2d0ccc8abf91daa8d5;hp=e166e24a69bea821a647e8b6fcc1f1fbf6a58858;hpb=9ab41ea15809c02ba46bf9e6911fbb1aa808b8b1;p=flightgear.git diff --git a/src/GUI/MapWidget.cxx b/src/GUI/MapWidget.cxx index e166e24a6..e92e7106d 100644 --- a/src/GUI/MapWidget.cxx +++ b/src/GUI/MapWidget.cxx @@ -8,8 +8,6 @@ #include // for std::sort #include -#include -#include #include #include #include @@ -387,7 +385,8 @@ MapWidget::MapWidget(int x, int y, int maxX, int maxY) : _width = maxX - x; _height = maxY - y; _hasPanned = false; - + _orthoAzimuthProject = false; + MapData::setFont(legendFont); MapData::setPalette(colour); @@ -681,7 +680,7 @@ void MapWidget::paintRoute() return; } - RoutePath path(_route->waypts()); + RoutePath path(_route->flightPlan()); // first pass, draw the actual lines glLineWidth(2.0); @@ -888,7 +887,7 @@ public: { _heliports = nd->getBoolValue("show-heliports", false); _hardRunwaysOnly = nd->getBoolValue("hard-surfaced-airports", true); - _minLengthFt = nd->getDoubleValue("min-runway-length-ft", 2000.0); + _minLengthFt = fgGetDouble("/sim/navdb/min-runway-length-ft", 2000); } virtual FGPositioned::Type maxType() const { @@ -938,11 +937,11 @@ public: } virtual FGPositioned::Type minType() const { - return _fixes ? FGPositioned::FIX : FGPositioned::VOR; + return _fixes ? FGPositioned::FIX : FGPositioned::NDB; } virtual FGPositioned::Type maxType() const { - return _navaids ? FGPositioned::NDB : FGPositioned::FIX; + return _navaids ? FGPositioned::VOR : FGPositioned::FIX; } private: @@ -1070,7 +1069,9 @@ void MapWidget::drawNavRadio(SGPropertyNode_ptr radio) // identify the tuned station - unfortunately we don't get lat/lon directly, // need to do the frequency search again double mhz = radio->getDoubleValue("frequencies/selected-mhz", 0.0); - FGNavRecord* nav = globals->get_navlist()->findByFreq(mhz, _aircraft); + + FGNavRecord* nav = FGNavList::findByFreq(mhz, _aircraft, + FGNavList::navFilter()); if (!nav || (nav->ident() != radio->getStringValue("nav-id"))) { // mismatch between navradio selection logic and ours! return; @@ -1112,7 +1113,7 @@ void MapWidget::drawNavRadio(SGPropertyNode_ptr radio) void MapWidget::drawTunedLocalizer(SGPropertyNode_ptr radio) { double mhz = radio->getDoubleValue("frequencies/selected-mhz", 0.0); - FGNavRecord* loc = globals->get_loclist()->findByFreq(mhz, _aircraft); + FGNavRecord* loc = FGNavList::findByFreq(mhz, _aircraft, FGNavList::locFilter()); if (!loc || (loc->ident() != radio->getStringValue("nav-id"))) { // mismatch between navradio selection logic and ours! return; @@ -1446,13 +1447,30 @@ void MapWidget::drawAIShip(const SGPropertyNode* model, const SGGeod& pos, doubl SGVec2d MapWidget::project(const SGGeod& geod) const { - // Sanson-Flamsteed projection, relative to the projection center + SGVec2d p; double r = earth_radius_lat(geod.getLatitudeRad()); - double lonDiff = geod.getLongitudeRad() - _projectionCenter.getLongitudeRad(), - latDiff = geod.getLatitudeRad() - _projectionCenter.getLatitudeRad(); - - SGVec2d p = SGVec2d(cos(geod.getLatitudeRad()) * lonDiff, latDiff) * r * currentScale(); + + if (_orthoAzimuthProject) { + // http://mathworld.wolfram.com/OrthographicProjection.html + double cosTheta = cos(geod.getLatitudeRad()); + double sinDLambda = sin(geod.getLongitudeRad() - _projectionCenter.getLongitudeRad()); + double cosDLambda = cos(geod.getLongitudeRad() - _projectionCenter.getLongitudeRad()); + double sinTheta1 = sin(_projectionCenter.getLatitudeRad()); + double sinTheta = sin(geod.getLatitudeRad()); + double cosTheta1 = cos(_projectionCenter.getLatitudeRad()); + + p = SGVec2d(cosTheta * sinDLambda, + (cosTheta1 * sinTheta) - (sinTheta1 * cosTheta * cosDLambda)) * r * currentScale(); + + } else { + // Sanson-Flamsteed projection, relative to the projection center + double lonDiff = geod.getLongitudeRad() - _projectionCenter.getLongitudeRad(), + latDiff = geod.getLatitudeRad() - _projectionCenter.getLatitudeRad(); + p = SGVec2d(cos(geod.getLatitudeRad()) * lonDiff, latDiff) * r * currentScale(); + + } + // rotate as necessary double cost = cos(_upHeading * SG_DEGREES_TO_RADIANS), sint = sin(_upHeading * SG_DEGREES_TO_RADIANS); @@ -1472,10 +1490,21 @@ SGGeod MapWidget::unproject(const SGVec2d& p) const double r = earth_radius_lat(_projectionCenter.getLatitudeRad()); SGVec2d unscaled = ur * (1.0 / (currentScale() * r)); - double lat = unscaled.y() + _projectionCenter.getLatitudeRad(); - double lon = (unscaled.x() / cos(lat)) + _projectionCenter.getLongitudeRad(); - - return SGGeod::fromRad(lon, lat); + if (_orthoAzimuthProject) { + double phi = length(p); + double c = asin(phi); + double sinTheta1 = sin(_projectionCenter.getLatitudeRad()); + double cosTheta1 = cos(_projectionCenter.getLatitudeRad()); + + double lat = asin(cos(c) * sinTheta1 + ((unscaled.y() * sin(c) * cosTheta1) / phi)); + double lon = _projectionCenter.getLongitudeRad() + + atan((unscaled.x()* sin(c)) / (phi * cosTheta1 * cos(c) - unscaled.y() * sinTheta1 * sin(c))); + return SGGeod::fromRad(lon, lat); + } else { + double lat = unscaled.y() + _projectionCenter.getLatitudeRad(); + double lon = (unscaled.x() / cos(lat)) + _projectionCenter.getLongitudeRad(); + return SGGeod::fromRad(lon, lat); + } } double MapWidget::currentScale() const