From 5e796d2dd5a2540c2c208a0ec2d2e173bd3c623f Mon Sep 17 00:00:00 2001
From: Christian Schmitt <chris@ilovelinux.de>
Date: Tue, 23 Oct 2012 19:14:05 +0200
Subject: [PATCH] Runway lights: convert ODALS to SGGeod

---
 src/Airports/GenAirports850/lights.cxx | 60 +++++++-------------------
 1 file changed, 16 insertions(+), 44 deletions(-)

diff --git a/src/Airports/GenAirports850/lights.cxx b/src/Airports/GenAirports850/lights.cxx
index c3bf77de..685d9221 100644
--- a/src/Airports/GenAirports850/lights.cxx
+++ b/src/Airports/GenAirports850/lights.cxx
@@ -1508,68 +1508,40 @@ TGSuperPoly Runway::gen_odals( bool recip )
     int i;
     string flag;
 
-    SG_LOG(SG_GENERAL, SG_DEBUG, "gen odals " << rwy.rwnum[0] );
-
     // ODALS lighting is omni-directional, but we generate a normal as
     // a placeholder to keep everything happy.
     Point3D normal( 0.0, 0.0, 0.0 );
 
-    point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 );
-
     // determine the start point.
-    Point3D ref1, ref2;
+    SGGeod ref, pt;
     double length_hdg, left_hdg;
-    double lon, lat, r;
+
     if ( recip ) {
-        ref1 = corner[0];
-        ref2 = corner[1];
-        length_hdg = rwy.heading + 180.0;
-        if ( length_hdg > 360.0 ) { length_hdg -= 360.0; }
+        length_hdg = SGMiscd::normalizePeriodic(0, 360, rwy.heading + 180);
+        ref = SGGeodesy::direct( GetEnd(), length_hdg, rwy.threshold[get_thresh0(recip)] );
         flag = rwy.rwnum[1];
     } else {
-        ref1 = corner[2];
-        ref2 = corner[3];
         length_hdg = rwy.heading;
+        ref = SGGeodesy::direct( GetStart(), length_hdg, rwy.threshold[get_thresh0(recip)] );
         flag = rwy.rwnum[0];
     }
-    left_hdg = length_hdg - 90.0;
-    if ( left_hdg < 0 ) { 
-        left_hdg += 360.0; 
-    }
-    SG_LOG(SG_GENERAL, SG_DEBUG, "length hdg = " << length_hdg << " left heading = " << left_hdg );
+    left_hdg = SGMiscd::normalizePeriodic(0, 360, length_hdg - 90.0);
+    double offset = rwy.width / 2 + 14;
 
-    Point3D ref = ( ref1 + ref2 ) / 2.0;
-
-    // offset 40' downwind
-    geo_direct_wgs_84 ( ref1.lat(), ref1.lon(), length_hdg, 
-                        -40 * SG_FEET_TO_METER, &lat, &lon, &r );
-    ref1 = Point3D( lon, lat, 0.0 );
-    // offset 40' left
-    geo_direct_wgs_84 ( ref1.lat(), ref1.lon(), left_hdg, 
-                        40 * SG_FEET_TO_METER, &lat, &lon, &r );
-    ref1 = Point3D( lon, lat, 0.0 );
-
-    lights.push_back( ref1 );
+    // offset 14m left of runway
+    pt = SGGeodesy::direct(ref, left_hdg, offset);
+    lights.push_back( Point3D::fromSGGeod(pt) );
     normals.push_back( normal );
     
-    // offset 40' downwind
-    geo_direct_wgs_84 ( ref2.lat(), ref2.lon(), length_hdg, 
-                        -40 * SG_FEET_TO_METER, &lat, &lon, &r );
-    ref2 = Point3D( lon, lat, 0.0 );
-    // offset 40' left
-    geo_direct_wgs_84 ( ref2.lat(), ref2.lon(), left_hdg, 
-                        -40 * SG_FEET_TO_METER, &lat, &lon, &r );
-    ref2 = Point3D( lon, lat, 0.0 );
-
-    lights.push_back( ref2 );
+    // offset 14m right of runway
+    pt = SGGeodesy::direct(ref, left_hdg, -offset);
+    lights.push_back( Point3D::fromSGGeod(pt) );
     normals.push_back( normal );
 
     for ( i = 0; i < 5; ++i ) {
-        // offset 100m downwind
-        geo_direct_wgs_84 ( ref.lat(), ref.lon(), length_hdg, 
-                            -100, &lat, &lon, &r );
-        ref = Point3D( lon, lat, 0.0 );
-        lights.push_back( ref );
+        // offset 90m downwind
+        ref = SGGeodesy::direct( ref, length_hdg, -90 );
+        lights.push_back( Point3D::fromSGGeod(ref) );
         normals.push_back( normal );
     }