Lee Elliott writes:

> Hello all,
> 
> Once you've started FG, the tower views are permently fixed to the departure 
> airfield.  Would it be difficult to optionally switch the tower views to the 
> destination airfield, when one is set in the AP waypoint list?
> 

Hi Lee,

There is code in the ATC system to find the closest ATC service of a given type to a 
given point.  It shouldn't be too hard to piggy-back that to get the closest tower 
view to the user if desired.

In commlist.hxx - FindClosest(...) It writes the info into an ATCData&, but it would 
be trivial to write a wrapper to return the ICAO code so the main program wouldn't 
have to know about ATCData.  Likewise it requires the atc_type (TOWER, GROUND, etc) to 
be passed in, but once again a wrapper function assuming tower could be quickly 
written so that the main program need know nothing about atc_type.

Oh sod it, I can't resist, putting the below in commlist.cxx with a header in 
commlist.hxx *should* work

commlist.hxx:
// Return the ICAO code of the nearest tower within m miles
// Returns XXXX if no tower within distance (defaults to 100)
string FindClosestTower(Point3D p, double m = 100);

// Return the ICAO code of the nearest tower within m miles
// Returns XXXX if no tower within distance (defaults to 100)
string FGCommList::FindClosestTower(Point3D p, double m) {
  ATCData d;
  double n = FindClosest(p.lon(), p.lat(), p.elev(), d, TOWER, m);
  if(n) {
    return(d.ident);
  } else {
    return("XXXX");
  }
}

You wouldn't want to call it every frame though - searches by area are not the most 
efficient.  (The ATC services are mapped by tile-id, but within the search area every 
tile-id is traversed, and the resultant ATC services found ordered by distance.)  
There are a fair few tiles within 100 miles = 200 X 200 miles = 40,000 sq miles!  
Given that that's too far to see, I've just added miles to be passed in to the above, 
since we can't see the plane at 100 miles!  I believe that I found some problem with 
very small distances such as 10 though - I seem to recall that if the centre of a tile 
fell outside the distance then the tile was excluded, and an ATC service quite close 
but on the edge of the tile could get overlooked.  Somewhere between 20 and 40 miles 
called intermittently (globals->get_current_commlist()->Find... etc) would probably do 
you.

Good luck!

Cheers - Dave

_______________________________________________
Flightgear-devel mailing list
[EMAIL PROTECTED]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel

Reply via email to