+// Return the runway closest to a given heading
+bool FGRunways::search( const string& aptid, const int tgt_hdg,
+ FGRunway* runway )
+{
+ string rwyNo = search(aptid, tgt_hdg);
+ return(rwyNo == "NN" ? false : search(aptid, rwyNo, runway));
+}
+
+
+// Return the runway number of the runway closest to a given heading
+string FGRunways::search( const string& aptid, const int tgt_hdg ) {
+ FGRunway r;
+ FGRunway tmp_r;
+ string rn;
+ double found_dir = 0.0;
+
+ if ( !search( aptid, &tmp_r ) ) {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Failed to find " << aptid << " in database." );
+ return "NN";
+ }
+
+ double diff;
+ double min_diff = 360.0;
+
+ while ( tmp_r.id == aptid ) {
+ r = tmp_r;
+
+ // forward direction
+ diff = tgt_hdg - r.heading;
+ while ( diff < -180.0 ) { diff += 360.0; }
+ while ( diff > 180.0 ) { diff -= 360.0; }
+ diff = fabs(diff);
+ // SG_LOG( SG_GENERAL, SG_INFO,
+ // "Runway " << r.rwy_no << " heading = " << r.heading <<
+ // " diff = " << diff );
+ if ( diff < min_diff ) {
+ min_diff = diff;
+ rn = r.rwy_no;
+ found_dir = 0;
+ }
+
+ // reverse direction
+ diff = tgt_hdg - r.heading - 180.0;
+ while ( diff < -180.0 ) { diff += 360.0; }
+ while ( diff > 180.0 ) { diff -= 360.0; }
+ diff = fabs(diff);
+ // SG_LOG( SG_GENERAL, SG_INFO,
+ // "Runway -" << r.rwy_no << " heading = " <<
+ // r.heading + 180.0 <<
+ // " diff = " << diff );
+ if ( diff < min_diff ) {
+ min_diff = diff;
+ rn = r.rwy_no;
+ found_dir = 180.0;
+ }
+
+ next( &tmp_r );
+ }
+
+ // SG_LOG( SG_GENERAL, SG_INFO, "closest runway = " << r.rwy_no
+ // << " + " << found_dir );
+ rn = r.rwy_no;
+ // cout << "In search, rn = " << rn << endl;
+ if ( found_dir == 180 ) {
+ rn = GetReverseRunwayNo(rn);
+ //cout << "New rn = " << rn << '\n';
+ }
+
+ return rn;
+}
+
+