From c7a18cb50126b98dc7a1fe06d7c7aa08f13489b3 Mon Sep 17 00:00:00 2001 From: Christian Schmitt <chris@ilovelinux.de> Date: Tue, 31 Jul 2012 16:26:12 +0200 Subject: [PATCH] Cleanup the genapts850 lights routine and move duplicate code into a seperate function --- src/Airports/GenAirports850/lights.cxx | 232 +++---------------------- src/Airports/GenAirports850/runway.hxx | 2 +- 2 files changed, 27 insertions(+), 207 deletions(-) diff --git a/src/Airports/GenAirports850/lights.cxx b/src/Airports/GenAirports850/lights.cxx index da373197..b434f312 100644 --- a/src/Airports/GenAirports850/lights.cxx +++ b/src/Airports/GenAirports850/lights.cxx @@ -80,6 +80,21 @@ Point3D Runway::gen_runway_light_vector( double angle, bool recip ) { return light_vec; } +point_list Runway::gen_corners(double l_ext, double disp1, double disp2, double w_ext) +{ + // using TGPolygon is a bit innefficient, but that's what the + // routine returns. + TGPolygon poly_corners = gen_runway_area_w_extend( l_ext, + disp1, + disp2, + w_ext ); + point_list corner; + for ( int i = 0; i < poly_corners.contour_size( 0 ); ++i ) { + corner.push_back( poly_corners.get_pt( 0, i ) ); + } + return corner; +} + // generate runway edge lighting // 60 meters spacing or the next number down that divides evenly. superpoly_list Runway::gen_runway_edge_lights( bool recip ) @@ -93,18 +108,7 @@ superpoly_list Runway::gen_runway_edge_lights( bool recip ) int divs = (int)(rwy.length / 60.0) + 1; Point3D normal = gen_runway_light_vector( 3.0, recip ); - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners(2.0, rwy.threshold[0], rwy.threshold[1], 2.0); Point3D inc1, inc2; Point3D pt1, pt2; @@ -187,89 +191,6 @@ superpoly_list Runway::gen_runway_edge_lights( bool recip ) return result; } - -// generate taxiway edge lighting -// 100 meters spacing or the next number down that divides evenly. -superpoly_list Runway::gen_taxiway_edge_lights( const int kind, bool recip ) -{ - point_list b_lights; b_lights.clear(); - point_list b_normals; b_normals.clear(); - int i; - - double len = rwy.length; - int divs; - if ( len > 100.0 ) { - // for lengths of 300' or more, max spacing is 200' - divs = (int)(len / 70.0) + 1; - } else { - // for lengths <= 300', max spacing = 100' - divs = (int)(len / 35.0) + 1; - } - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, 0.0, 0.0, 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } - - Point3D inc1, inc2; - Point3D pt1, pt2; - - if ( recip ) { - inc1 = (corner[3] - corner[0]) / divs; - inc2 = (corner[2] - corner[1]) / divs; - pt1 = corner[0]; - pt2 = corner[1]; - } else { - inc1 = (corner[0] - corner[3]) / divs; - inc2 = (corner[1] - corner[2]) / divs; - pt1 = corner[3]; - pt2 = corner[2]; - } - - double dist = rwy.length; - double step = dist / divs; - - Point3D up = sgGeodToCart( corner[0] * SG_DEGREES_TO_RADIANS ); - double length = up.distance3D( Point3D(0.0) ); - up = up / length; - - b_lights.push_back( pt1 ); - b_normals.push_back( up ); - b_lights.push_back( pt2 ); - b_normals.push_back( up ); - dist -= step; - - for ( i = 0; i < divs; ++i ) { - pt1 += inc1; - pt2 += inc2; - b_lights.push_back( pt1 ); - b_normals.push_back( up ); - b_lights.push_back( pt2 ); - b_normals.push_back( up ); - } - - TGPolygon lights_poly; lights_poly.erase(); - TGPolygon normals_poly; normals_poly.erase(); - lights_poly.add_contour( b_lights, false ); - normals_poly.add_contour( b_normals, false ); - - TGSuperPoly blue; - blue.set_poly( lights_poly ); - blue.set_normals( normals_poly ); - blue.set_material( "RWY_BLUE_TAXIWAY_LIGHTS" ); - - superpoly_list result; result.clear(); - - result.push_back( blue ); - - return result; -} - - // generate threshold lights for a 3 degree approach superpoly_list Runway::gen_runway_threshold_lights( const int kind, bool recip ) { @@ -280,18 +201,8 @@ superpoly_list Runway::gen_runway_threshold_lights( const int kind, bool recip ) int i; SG_LOG(SG_GENERAL, SG_DEBUG, "gen threshold " << rwy.rwnum[0] ); - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 0.0, - rwy.threshold[0], - rwy.threshold[1], - 0.0 ); - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 ); // determine the start point. Point3D ref1, ref2, ref3, ref4; @@ -395,25 +306,13 @@ superpoly_list Runway::gen_runway_center_line_lights( bool recip ) point_list r_lights; r_lights.clear(); point_list w_normals; w_normals.clear(); point_list r_normals; r_normals.clear(); - int i; double len = rwy.length; // this should be 25' technically but I'm trying 50' to space things out int divs = (int)(len / (50.0*SG_FEET_TO_METER)) + 1; Point3D normal = gen_runway_light_vector( 3.0, recip ); - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 2.0, rwy.threshold[0], rwy.threshold[1], 2.0 ); Point3D inc; Point3D pt1, pt2; @@ -569,18 +468,7 @@ TGSuperPoly Runway::gen_touchdown_zone_lights( bool recip ) SG_LOG(SG_GENERAL, SG_DEBUG, "gen touchdown zone lights " << rwy.rwnum[0] ); Point3D normal; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 0.0, - rwy.threshold[0], - rwy.threshold[1], - 0.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 ); // determine the start point. Point3D ref; @@ -943,24 +831,12 @@ TGSuperPoly Runway::gen_reil( bool recip ) { point_list lights; lights.clear(); point_list normals; normals.clear(); - int i; string flag; SG_LOG(SG_GENERAL, SG_DEBUG, "gen reil " << rwy.rwnum[0] ); Point3D normal; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 0.0, - rwy.threshold[0], - rwy.threshold[1], - 0.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 ); // determine the start point. Point3D ref1, ref2; @@ -1054,18 +930,7 @@ superpoly_list Runway::gen_calvert( const string &kind, bool recip ) double len = rwy.length; int divs = (int)(len / 10.0) + 1; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 2.0, rwy.threshold[0], rwy.threshold[1], 2.0 ); Point3D inc; Point3D pt; @@ -1439,18 +1304,7 @@ superpoly_list Runway::gen_alsf( const string &kind, bool recip ) double len = rwy.length; int divs = (int)(len / 10.0) + 1; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 2.0, rwy.threshold[0], rwy.threshold[1], 2.0 ); Point3D inc; Point3D pt; @@ -1946,17 +1800,7 @@ TGSuperPoly Runway::gen_odals( bool recip ) // a placeholder to keep everything happy. Point3D normal( 0.0, 0.0, 0.0 ); - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 0.0, - rwy.threshold[0], - rwy.threshold[1], - 0.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 ); // determine the start point. Point3D ref1, ref2; @@ -2055,18 +1899,7 @@ superpoly_list Runway::gen_ssalx( const string& kind, bool recip ) double len = rwy.length; int divs = (int)(len / 10.0) + 1; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 2.0, rwy.threshold[0], rwy.threshold[1], 2.0 ); Point3D inc; Point3D pt; @@ -2324,18 +2157,7 @@ superpoly_list Runway::gen_malsx( const string& kind, bool recip ) double len = rwy.length; int divs = (int)(len / 10.0) + 1; - - // using TGPolygon is a bit innefficient, but that's what the - // routine returns. - TGPolygon poly_corners = gen_runway_area_w_extend( 2.0, - rwy.threshold[0], - rwy.threshold[1], - 2.0 ); - - point_list corner; - for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { - corner.push_back( poly_corners.get_pt( 0, i ) ); - } + point_list corner = gen_corners( 2.0, rwy.threshold[0], rwy.threshold[1], 2.0 ); Point3D inc; Point3D pt; @@ -2474,7 +2296,6 @@ superpoly_list Runway::gen_malsx( const string& kind, bool recip ) if ( kind == "R" ) { // generate 5 rabbit lights - ref = ref_save; // start 1600' downwind @@ -2482,7 +2303,7 @@ superpoly_list Runway::gen_malsx( const string& kind, bool recip ) -1600 * SG_FEET_TO_METER, &lat, &lon, &r ); ref = Point3D( lon, lat, 0.0 ); - for ( i = 0; i < 8; ++i ) { + for ( i = 0; i < 5; ++i ) { s_lights.push_back( ref ); s_normals.push_back( normal1 ); @@ -2625,7 +2446,6 @@ void Runway::gen_runway_lights( superpoly_list *lights ) { // Approach lighting - if ( rwy.approach_lights[0] == 1 /* ALSF-I */ ) { superpoly_list s = gen_alsf( "1", false ); for ( i = 0; i < s.size(); ++i ) { diff --git a/src/Airports/GenAirports850/runway.hxx b/src/Airports/GenAirports850/runway.hxx index f4045d46..7a3b557a 100644 --- a/src/Airports/GenAirports850/runway.hxx +++ b/src/Airports/GenAirports850/runway.hxx @@ -151,9 +151,9 @@ private: void gen_runway_lights( superpoly_list* lights ); + point_list gen_corners( double l_ext, double disp1, double disp2, double w_ext ); Point3D gen_runway_light_vector( double angle, bool recip ); superpoly_list gen_runway_edge_lights( bool recip ); - superpoly_list gen_taxiway_edge_lights( const int kind, bool recip ); superpoly_list gen_runway_threshold_lights( const int kind, bool recip ); superpoly_list gen_runway_center_line_lights( bool recip ); TGSuperPoly gen_touchdown_zone_lights( bool recip );