+FGRunway* FGAirport::getRunwayByIndex(unsigned int aIndex) const
+{
+ assert(aIndex >= 0 && aIndex < mRunways.size());
+ return mRunways[aIndex];
+}
+
+bool FGAirport::hasRunwayWithIdent(const string& aIdent) const
+{
+ return (getIteratorForRunwayIdent(aIdent) != mRunways.end());
+}
+
+FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const
+{
+ Runway_iterator it = getIteratorForRunwayIdent(aIdent);
+ if (it == mRunways.end()) {
+ SG_LOG(SG_GENERAL, SG_ALERT, "no such runway '" << aIdent << "' at airport " << ident());
+ throw sg_range_exception("unknown runway " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent");
+ }
+
+ return *it;
+}
+
+FGAirport::Runway_iterator
+FGAirport::getIteratorForRunwayIdent(const string& aIdent) const
+{
+ string ident(aIdent);
+ if ((aIdent.size() == 1) || !isdigit(aIdent[1])) {
+ ident = "0" + aIdent;
+ }
+
+ Runway_iterator it = mRunways.begin();
+ for (; it != mRunways.end(); ++it) {
+ if ((*it)->ident() == ident) {
+ return it;
+ }
+ }
+
+ return it; // end()
+}
+
+FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const
+{
+ Runway_iterator it = mRunways.begin();
+ FGRunway* result = NULL;
+ double currentBestQuality = 0.0;
+
+ SGPropertyNode *param = fgGetNode("/sim/airport/runways/search", true);
+ double lengthWeight = param->getDoubleValue("length-weight", 0.01);
+ double widthWeight = param->getDoubleValue("width-weight", 0.01);
+ double surfaceWeight = param->getDoubleValue("surface-weight", 10);
+ double deviationWeight = param->getDoubleValue("deviation-weight", 1);
+
+ for (; it != mRunways.end(); ++it) {
+ double good = (*it)->score(lengthWeight, widthWeight, surfaceWeight);
+
+ double dev = aHeading - (*it)->headingDeg();
+ SG_NORMALIZE_RANGE(dev, -180.0, 180.0);
+ double bad = fabs(deviationWeight * dev) + 1e-20;
+ double quality = good / bad;
+
+ if (quality > currentBestQuality) {
+ currentBestQuality = quality;
+ result = *it;
+ }
+ }
+
+ return result;
+}
+
+bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const
+{
+ unsigned int numRunways(mRunways.size());
+ for (unsigned int r=0; r<numRunways; ++r) {
+ FGRunway* rwy = mRunways[r];
+ if (rwy->isReciprocal()) {
+ continue; // we only care about lengths, so don't do work twice
+ }