-
- double LENWGT = fgGetDouble("/tmp/runway-search/length", 0.01);
- double WIDWGT = fgGetDouble("/tmp/runway-search/width", 0.01);
- double SURFWGT = fgGetDouble("/tmp/runway-search/surface", 10);
- double DEVWGT = fgGetDouble("/tmp/runway-search/deviation", 1);
-
- FGRunway best;
- double max = 0.0;
- bool reversed = false;
-
- do {
- if (r._id != aptid)
- break;
- if (r._type != "runway")
- continue;
-
- int surface = 0;
- if (r._surface_code == 1 || r._surface_code == 2) // asphalt & concrete
- surface = 2;
- else if (r._surface_code == 12 || r._surface_code == 5) // dry lakebed & gravel
- surface = 1;
-
- double quality, bad, diff;
- double good = LENWGT * r._length + WIDWGT * r._width + SURFWGT * surface;
-
- // 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_DEBUG, " 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_DEBUG, " 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;