X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavrecord.cxx;h=041c12f1a663fc84aef85f6b021682eedb01c089;hb=97a251544371dbe9073a2c77df8b936176b916dc;hp=26dfa2532bf059aba28b3a4c4142a438440f1881;hpb=6db8687a75fcb0864a0f4c288b23026f2cd66ca5;p=flightgear.git diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx index 26dfa2532..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); } @@ -178,6 +181,38 @@ void FGNavRecord::alignLocaliserWithRunway(double aThreshold) } } +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)