From: curt Date: Thu, 11 Feb 1999 01:10:50 +0000 (+0000) Subject: Start of scenery revamp project. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=b1eb65cd5dae2e88f1ad4606e6a4bb2134b15fe0;p=flightgear.git Start of scenery revamp project. --- diff --git a/GenAirports/Makefile.am b/GenAirports/Makefile.am index 8ba8e5d1d..70e1c076c 100644 --- a/GenAirports/Makefile.am +++ b/GenAirports/Makefile.am @@ -34,6 +34,8 @@ genapts_SOURCES = \ genapts_LDADD = \ $(top_builddir)/Lib/Bucket/libBucket.a \ + $(top_builddir)/Lib/Debug/libDebug.a \ + $(top_builddir)/Lib/Misc/libMisc.a \ $(top_builddir)/Lib/zlib/libz.a \ $(base_LIBS) @@ -42,6 +44,9 @@ INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib #--------------------------------------------------------------------------- # $Log$ +# Revision 1.4 1999/02/11 01:10:50 curt +# Start of scenery revamp project. +# # Revision 1.3 1998/11/04 23:01:54 curt # Changes to the automake/autoconf system to reduce the number of libraries # that are unnecessarily linked into the various executables. diff --git a/GenAirports/main.cxx b/GenAirports/main.cxx index 475ae10ea..47297b91b 100644 --- a/GenAirports/main.cxx +++ b/GenAirports/main.cxx @@ -27,6 +27,8 @@ #include #endif +#include + #ifdef HAVE_STDLIB_H #include #endif @@ -34,16 +36,55 @@ #include #include #include -#include +#include STL_STRING -#include +#include +#include #include -#include +#include #include "area.hxx" #include "convex_hull.hxx" +// write out airport data +void write_airport( list_container hull_list, FGBucket b, const string& root, + const bool cut_and_keep ) { + char tmp[256]; + + long int index = b.gen_index(); + string base = b.gen_base_path(); + string path = root + "/Scenery/" + base; + string command = "mkdir -p " + path; + system( command.c_str() ); + + sprintf(tmp, "%ld", index); + string aptfile = path + "/" + tmp + ".apt"; + cout << "apt file = " << aptfile << endl; + + FILE *fd; + if ( (fd = fopen(aptfile.c_str(), "a")) == NULL ) { + cout << "Cannot open file: " << aptfile << endl; + exit(-1); + } + + if ( cut_and_keep ) { + fprintf( fd, "cut_and_keep\n" ); + } else { + fprintf( fd, "cut_and_ignore\n" ); + } + fprintf( fd, "%d\n", hull_list.size() ); + // write perimeter polygon + list_iterator current = hull_list.begin(); + list_iterator last = hull_list.end(); + for ( ; current != last ; ++current ) { + fprintf( fd, "%.7f %.7f\n", (*current).lon, (*current).lat ); + } + + fclose(fd); +} + + // process and airport + runway list void process_airport( string last_airport, list < string > & runway_list, const string& root ) { @@ -52,26 +93,19 @@ void process_airport( string last_airport, list < string > & runway_list, string line_str; double lon, lat; + // int i; + int count; + + // generate the vertices of all the runways int len, width, hdg, label_hdg, elev; char codes[10]; char side; - point2d average; - double sum_x, sum_y; - - FILE *fd; - fgBUCKET b; - long int index; - char base[256], tmp[256]; - string path, command, exfile, file, aptfile; - int i, count; - - printf( "(apt) %s", last_airport.c_str() ); - + cout << "(apt) " << last_airport; list < string >::iterator last_runway = runway_list.end(); for ( list < string >::iterator current_runway = runway_list.begin(); current_runway != last_runway ; ++current_runway ) { line_str = (*current_runway); - printf( "%s", line_str.c_str() ); + cout << line_str; sscanf( line_str.c_str(), "%lf %lf %d %d %d %s %d %c %d\n", &lon, &lat, &len, &width, &hdg, codes, &label_hdg, @@ -90,123 +124,75 @@ void process_airport( string last_airport, list < string > & runway_list, } // printf("Runway points in degrees\n"); - current = apt_list.begin(); - last = apt_list.end(); - for ( ; current != last; ++current ) { - // printf( "%.5f %.5f\n", current->lon, current->lat ); - } + // current = apt_list.begin(); + // last = apt_list.end(); + // for ( ; current != last; ++current ) { + // printf( "%.5f %.5f\n", current->lon, current->lat ); + // } // printf("\n"); // generate convex hull hull_list = convex_hull(apt_list); - // find average center point of convex hull + // find average center, min, and max point of convex hull + point2d average, min, max; + double sum_x, sum_y; count = hull_list.size(); - current = hull_list.begin(); last = hull_list.end(); sum_x = sum_y = 0.0; + min.x = min.y = 200.0; + max.x = max.y = -200.0; for ( ; current != last; ++current ) { // printf("return = %.6f %.6f\n", (*current).x, (*current).y); sum_x += (*current).x; sum_y += (*current).y; - } + if ( (*current).x < min.x ) { min.x = (*current).x; } + if ( (*current).y < min.y ) { min.y = (*current).y; } + if ( (*current).x > max.x ) { max.x = (*current).x; } + if ( (*current).y > max.y ) { max.y = (*current).y; } + } average.x = sum_x / count; average.y = sum_y / count; - // find bucket based on average center point of hull list. - // Eventually we'll need to handle cases where the area crosses - // bucket boundaries. - fgBucketFind( average.lon, average.lat, &b); - printf( "Bucket = lon,lat = %d,%d x,y index = %d,%d\n", - b.lon, b.lat, b.x, b.y); - - index = fgBucketGenIndex(&b); - fgBucketGenBasePath(&b, base); - path = root + "/Scenery/" + base; - command = "mkdir -p " + path; - system( command.c_str() ); - - sprintf(tmp, "%ld", index); - exfile = path + "/" + tmp + ".node.ex"; - file = path + "/" + tmp + ".poly"; - aptfile = path + "/" + tmp + ".apt"; - printf( "extra node file = %s\n", exfile.c_str() ); - printf( "poly file = %s\n", file.c_str() ); - printf( "apt file = %s\n", aptfile.c_str() ); - - // output exclude nodes - printf("Output exclude nodes\n"); - if ( (fd = fopen(exfile.c_str(), "w")) == NULL ) { - printf("Cannot open file: %s\n", exfile.c_str()); - exit(-1); - } - - fprintf( fd, "%d 2 0 0\n", count ); - - current = hull_list.begin(); - last = hull_list.end(); - i = 1; - for ( ; current != last ; ++current ) { - // printf( "(%.4f, %.4f)\n", - fprintf( fd, "%d %.2f %.2f %.2f\n", i, - (*current).lon * 3600.0, (*current).lat * 3600.0, - (double)elev * FEET_TO_METER ); - ++i; - } - fclose(fd); - - // output poly - printf("Output poly\n"); - if ( (fd = fopen(file.c_str(), "w")) == NULL ) { - printf("Cannot open file: %s\n", file.c_str()); - exit(-1); - } - - // output empty node list - fprintf(fd, "0 2 0 0\n"); - - // output segments - fprintf( fd, "%d 0\n", count ); - for ( i = 1; i < count; i++ ) { - fprintf( fd, "%d %d %d\n", i, i, i + 1 ); - } - fprintf( fd, "%d %d %d\n", count, count, 1 ); - - // output hole center - fprintf( fd, "1\n"); - fprintf( fd, "1 %.2f %.2f\n", average.x * 3600.0, average.y * 3600); - - fclose(fd); - - // output "apt" file - printf("Output airport\n"); - if ( (fd = fopen(aptfile.c_str(), "w")) == NULL ) { - printf("Cannot open file: %s\n", aptfile.c_str()); - exit(-1); - } - - // write main airport identifier - fprintf(fd, "a %s", last_airport.c_str() ); - - // write perimeter polygon - current = hull_list.begin(); - last = hull_list.end(); - for ( ; current != last ; ++current ) { - fprintf( fd, "p %.7f %.7f %.2f\n", (*current).lon, (*current).lat, - (double)elev * FEET_TO_METER ); - } + // find buckets for center, min, and max points of convex hull. + // note to self: self, you should think about checking for runways + // that span the data line + FGBucket b(average.lon, average.lat); + FGBucket b_min(min.x, min.y); + FGBucket b_max(max.x, max.y); + cout << "Bucket center = " << b << endl; + cout << "Bucket min = " << b_min << endl; + cout << "Bucket max = " << b_max << endl; + + if ( b_min == b_max ) { + write_airport( hull_list, b, root, true ); + } else { + FGBucket b_cur; + int dx, dy, i, j; + + fgBucketDiff(b_min, b_max, &dx, &dy); + cout << "airport spans tile boundaries" << endl; + cout << " dx = " << dx << " dy = " << dy << endl; + + if ( (dx > 1) || (dy > 1) ) { + cout << "somethings really wrong!!!!" << endl; + exit(-1); + } - // write runway info - for ( list < string >::iterator current_runway = runway_list.begin(); - current_runway != last_runway ; ++current_runway ) { - line_str = (*current_runway); - line_str = line_str.substr(1, line_str.size()); - fprintf(fd, "r %s", line_str.c_str() ); + for ( j = 0; j <= dy; j++ ) { + for ( i = 0; i <= dx; i++ ) { + b_cur = fgBucketOffset(min.x, min.y, i, j); + if ( b_cur == b ) { + write_airport( hull_list, b_cur, root, true ); + } else { + write_airport( hull_list, b_cur, root, false ); + } + } + } + // string answer; cin >> answer; } - - fclose(fd); } @@ -214,38 +200,30 @@ void process_airport( string last_airport, list < string > & runway_list, // airport records int main( int argc, char **argv ) { list < string > runway_list; - string apt_path, gz_apt_path; string airport, last_airport; - fgFile f; - char line[256]; - /* - fgBUCKET b; - point2d nodes[4]; - char base[256], path[256], command[256], file[256], exfile[256]; - double lon, lat, elevation, heading; - double length, width; - long int index; - */ + string line; + char tmp[256]; + + fglog().setLogLevels( FG_ALL, FG_DEBUG ); if ( argc != 3 ) { - printf("Usage %s \n", argv[0]); - exit(0); + FG_LOG( FG_GENERAL, FG_ALERT, + "Usage " << argv[0] << " " ); + exit(-1); } - apt_path = argv[1]; - gz_apt_path = apt_path + ".gz"; - - // first try "path.gz" - if ( (f = fgopen(gz_apt_path.c_str(), "rb")) == NULL ) { - // next try "path" - if ( (f = fgopen(apt_path.c_str(), "rb")) == NULL ) { - printf( "Cannot open file: %s\n", apt_path.c_str()); - } + fg_gzifstream in( argv[1] ); + if ( !in ) { + FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << argv[1] ); + exit(-1); } - while ( fggets(f, line, 250) != NULL ) { - // printf("%s", line); - if ( strlen(line) == 0 ) { + while ( ! in.eof() ) { + in.getline(tmp, 256); + line = tmp; + // cout << line << endl; + + if ( line.length() == 0 ) { // empty, skip } else if ( line[0] == '#' ) { // comment, skip @@ -273,13 +251,14 @@ int main( int argc, char **argv ) { process_airport(last_airport, runway_list, argv[2]); } - fgclose(f); - - return(1); + return 0; } // $Log$ +// Revision 1.6 1999/02/11 01:10:51 curt +// Start of scenery revamp project. +// // Revision 1.5 1998/09/17 18:40:43 curt // Debug message tweaks. //