X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavrecord.cxx;h=041c12f1a663fc84aef85f6b021682eedb01c089;hb=97a251544371dbe9073a2c77df8b936176b916dc;hp=2029d2b7d3e004a2aa10c6b4c0de1432251f6741;hpb=a6db6d89ff41a619569e6433409e8bf62ff98499;p=flightgear.git diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx index 2029d2b7d..041c12f1a 100644 --- a/src/Navaids/navrecord.cxx +++ b/src/Navaids/navrecord.cxx @@ -91,6 +91,9 @@ void FGNavRecord::initAirportRelation() } mRunway = getRunwayFromName(_name); + if (!mRunway) { + return; + } if (type() != GS) { readAirportSceneryData(); @@ -101,7 +104,7 @@ void FGNavRecord::initAirportRelation() mPosition.setElevationFt(mRunway->elevation()); } - if (type() == ILS) { + if (type() == ILS || type() == LOC) { mRunway->setILS(this); } @@ -173,11 +176,43 @@ void FGNavRecord::alignLocaliserWithRunway(double aThreshold) mPosition = SGGeod::fromGeodFt(newPos, mPosition.getElevationFt()); set_multiuse( mRunway->headingDeg() ); } else { - SG_LOG(SG_GENERAL, SG_WARN, "localizer:" << ident() << ", aligning with runway " + SG_LOG(SG_GENERAL, SG_DEBUG, "localizer:" << ident() << ", aligning with runway " << mRunway->ident() << " exceeded heading threshold"); } } +double FGNavRecord::localizerWidth() const +{ + if (!mRunway) { + return 6.0; + } + + SGVec3d thresholdCart(SGVec3d::fromGeod(mRunway->threshold())); + double axisLength = dist(cart(), thresholdCart); + double landingLength = dist(thresholdCart, SGVec3d::fromGeod(mRunway->end())); + +// Reference: http://dcaa.slv.dk:8000/icaodocs/ +// ICAO standard width at threshold is 210 m = 689 feet = approx 700 feet. +// ICAO 3.1.1 half course = DDM = 0.0775 +// ICAO 3.1.3.7.1 Sensitivity 0.00145 DDM/m at threshold +// implies peg-to-peg of 214 m ... we will stick with 210. +// ICAO 3.1.3.7.1 "Course sector angle shall not exceed 6 degrees." + +// Very short runway: less than 1200 m (4000 ft) landing length: + if (landingLength < 1200.0) { +// ICAO fudges localizer sensitivity for very short runways. +// This produces a non-monotonic sensitivity-versus length relation. + axisLength += 1050.0; + } + +// Example: very short: San Diego KMYF (Montgomery Field) ILS RWY 28R +// Example: short: Tom's River KMJX (Robert J. Miller) ILS RWY 6 +// Example: very long: Denver KDEN (Denver) ILS RWY 16R + double raw_width = 210.0 / axisLength * SGD_RADIANS_TO_DEGREES; + return raw_width < 6.0? raw_width : 6.0; + +} + FGTACANRecord::FGTACANRecord(void) : channel(""), freq(0)