-
-// Return the runway number of the runway closest to a given heading
-#include <Main/fg_props.hxx> // FIXME remove
-string FGRunwayList::search( const string& aptid, const int hdg ) {
- //SG_LOG(SG_GENERAL, SG_DEBUG, "searching runway for " << aptid
- // << " with target heading " << hdg);
-
- FGRunway r;
- if (!search(aptid, &r)) {
- SG_LOG(SG_GENERAL, SG_ALERT, "Failed to find "
- << aptid << " in database.");
- return "NN";
- }
-
- 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;