-
- SGPropertyNode *param = fgGetNode("/sim/airport/runways/search", true);
- double lenwgt = param->getDoubleValue("length-weight", 0.01);
- double widwgt = param->getDoubleValue("width-weight", 0.01);
- double surfwgt = param->getDoubleValue("surface-weight", 10);
- double devwgt = param->getDoubleValue("deviation-weight", 1);
-
- FGRunway best;
- double max = 0.0;
- bool reversed = false;
-
- do {
- if (r._id != aptid)
- break;
- if (r._type != "runway")
- continue;
-
- int surface = 1;
- if (r._surface_code == 12 || r._surface_code == 5) // dry lakebed & gravel
- surface = 2;
- else if (r._surface_code == 1 || r._surface_code == 2) // asphalt & concrete
- surface = 3;
-
- double quality, bad, diff;
- double good = lenwgt * r._length + widwgt * r._width + surfwgt * surface + 1e-20;
-
- // this side
- diff = hdg - r._heading;
- while (diff < -180)
- diff += 360;
- while (diff >= 180)
- diff -= 360;
- bad = fabs(devwgt * diff) + 1e-20;
-
- quality = good / bad;
- //SG_LOG(SG_GENERAL, SG_ALERT, " runway " << r._rwy_no << " -> " << quality);
- if (quality > max) {
- max = quality;
- best = r;
- reversed = false;
- }
-
- // other side
- diff = hdg - r._heading - 180;
- while (diff < -180)
- diff += 360;
- while (diff >= 180)
- diff -= 360;
- bad = fabs(devwgt * diff) + 1e-20;
-
- quality = good / bad;
- //SG_LOG(SG_GENERAL, SG_ALERT, " runway " << GetReverseRunwayNo(r._rwy_no)
- // << " -> " << quality);
- if (quality > max) {
- max = quality;
- best = r;
- reversed = true;
- }
-
- } while (next(&r));
-
- return reversed ? GetReverseRunwayNo(best._rwy_no) : best._rwy_no;