xxallrounderxx Posted December 29, 2014 Report Posted December 29, 2014 Hi there! I'm working at the moment on a little tool which positions (or should) your plane 4nm away from the runway. I already got it working setting the altitude and speed, but when it comes to longitude and latitude i have a problem. As said i want to position the aircracft 4 nautical miles away from the runway. I thought it should work with picking the runway coordinates and adding values to the latitude and longitude (Offsets 0560, 0568). I was able to calculate with the law of sines the the values i have to add. But those values are in nautical miles (because I used the 4nm as my hypotenuse for my calculation)... so how do I convert them into FS Values? Thanks in advance Philipp
Paul Henty Posted December 29, 2014 Report Posted December 29, 2014 Pete's away at the moment so I'll tell you how I did this in my .NET Client DLL for FSUIPC. It has a helper class for calculating the very thing you describe. I assume you're not using .NET and so can't use these facilities, so here's what's 'under the hood': What I suggest is not converting the NM distances into FS Units, but rather use them to calculate new Lon/Lat positions, then convert these to FS Units in the normal way. Converting Lon/Lat to FS Units for 0560 and 0568 is well documented and fairly easy. Trying to convert NM distances into these units is not documented and more difficult. Adding/subtracting NM distances to Lon/Lat coordinates is easy for Latitude and a bit more cumbersome for Longitude. The following calculations all assume the Lon/Lat is in pure degrees and fractions of a degree (e.g. you're working with a value of 50.5 degrees representing 50 Degrees 30 Minutes) Latitude: 1 Nautical Mile = 1/60th of 1 degree of Latitude, or 1 Degree of Latitude = 60 NM. Therefore the number of degrees (or fraction of degrees) to add for distance d in NM = d / 60. e.g. Adding 30NM to latitude 50.454: 50.454 + (30 / 60) = 50.954 Longitude: A bit more tricky because the length of 1 degree of longitude varies depending on the latitude because the circles of longitude are smaller towards the pole than at the equator. The first step is to figure out the length of a degree of longitude at the latitude of the point. This is given by: cosine(latitude) * circumference of FS equator / 360 The circumference of the FS Equator is 40,075km = 21,638.7689 NM So at 49.882 degrees latitude, one degree of longitude (in FS at least) is: cos(49.882) * 21638.7689 / 360 = 38.73 NM (Assume the cos function above takes degrees to keep this simple. Most programming languages have trig functions that take radians). The next step is to calculate the number of degrees of longitude to add for the given distance (same as latitude but using the value from step 1 instead of the fixed 60 value) e.g. Adding 30mn to 2.33 degrees longitude at latitude 49.882: 2.33 + (30 / 38.73) = 3.10 Once you have the new Lon/Lat you can just do the normal conversion to FS units to write to the offsets you mentioned. Paul Nothing in this post should be used for real-world navigation :smile:
xxallrounderxx Posted December 30, 2014 Author Report Posted December 30, 2014 Many Thanks Paul! Very well explained. Now I'm a big step further in "developing" my little tool ;) I assume you're not using .NET and so can't use these facilities, so here's what's 'under the hood': Actually I'm using Visual Studio and working with .NET :smile: Thanks a lot Philipp EDIT: I just realized that you added an example project to the FSUIPC Client DLL Package :oops: . I took the code for positioning the plane on the runway and edited it a bit(the distance, the heading, and the start position): Dim latFS As Offset(Of Long) = New FSUIPC.Offset(Of Long)(&H560) Dim lonFS As Offset(Of Long) = New FSUIPC.Offset(Of Long)(&H568) slewMode.Value = 1 CMD_PAUSE.Value = 1 FSUIPCConnection.Process() Dim lon As FsLongitude = New FsLongitude(lonFS.Value) Dim lat As FsLatitude = New FsLatitude(latFS.Value) Dim newPos As FsLatLonPoint = New FsLatLonPoint(lat, lon) Dim rwyTrueHeading As Double = 161.18D newPos = newPos.OffsetByNauticalMiles(rwyTrueHeading, 4) latFS.Value = newPos.Latitude.ToFSUnits8() lonFS.Value = newPos.Longitude.ToFSUnits8() speed.Value = 180 * 128 alt.Value = 1870 / 3.28 FSUIPCConnection.Process() slewMode.Value = 0 FSUIPCConnection.Process() CMD_WRITE.Value = REFRESH_SCENERY FSUIPCConnection.Process() It works quite well and everything seems logical, BUT: The plane is positioned 4nm away from the runway edge but not infront of it. It's a bit aside(see at the attached picture). What did I wrong? Thanks again :)
Paul Henty Posted December 30, 2014 Report Posted December 30, 2014 The runway heading you used (161) seems to be the Magnetic heading. You need to use True headings when working with Lon/Lat positions. The True heading of this runway is about 164. If you don't have the true headings for the runways you can derive them from the magnetic headings by adding the magnetic variation. This can be found is offset 02A0, but only gives the value for the current position of the player. Paul
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now