From 698ca7b1a6274587b11d6ce4634621f625100269 Mon Sep 17 00:00:00 2001 From: curt <curt> Date: Wed, 29 Nov 2000 20:17:27 +0000 Subject: [PATCH] Fixed a problem with dividing the tile up into land use areas (original scheme left really tiny slivers on the edges.) --- src/BuildTiles/Main/main.cxx | 50 ++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/BuildTiles/Main/main.cxx b/src/BuildTiles/Main/main.cxx index 3f769219..bafc56b7 100644 --- a/src/BuildTiles/Main/main.cxx +++ b/src/BuildTiles/Main/main.cxx @@ -219,6 +219,30 @@ static void inline add_to_polys ( FGPolygon &accum, const FGPolygon &poly) { } +// make the area specified area, look up the land cover type, and add +// it to polys +static void make_area( const LandCover &cover, FGPolygon *polys, + double x1, double y1, double x2, double y2, + double half_dx, double half_dy ) +{ + // Look up the land cover for the square + int cover_value = cover.getValue( x1 + half_dx, y1 + half_dy ); + cout << " position: " << x1 << ',' << y1 << ',' + << cover.getDescUSGS(cover_value) << endl; + AreaType area = translateUSGSCover(cover_value); + if (area != DefaultArea) { + // Create a square polygon and merge it into the list. + FGPolygon poly; + poly.erase(); + poly.add_node(0, Point3D(x1, y1, 0.0)); + poly.add_node(0, Point3D(x1, y2, 0.0)); + poly.add_node(0, Point3D(x2, y2, 0.0)); + poly.add_node(0, Point3D(x2, y1, 0.0)); + add_to_polys(polys[area], poly); + } +} + + // Generate polygons from la and-cover raster. Horizontally- or // vertically-adjacent polygons will be merged automatically. static int actual_load_landcover ( FGConstruct & c, @@ -245,6 +269,9 @@ static int actual_load_landcover ( FGConstruct & c, double dx = 1.0 / 120.0; double dy = dx; + double half_dx = dx * 0.5; + double half_dy = half_dx; + // Figure out how many units wide and high this tile is; each unit // is 30 arc seconds. // int x_span = int(120 * bucket_span(base_lat)); // arcsecs of longitude @@ -255,32 +282,21 @@ static int actual_load_landcover ( FGConstruct & c, double x2 = x1 + dx; double y2 = y1 + dy; - while ( x1 < max_lon ) { - while ( y1 < max_lat ) { - // Look up the land cover for the square - int cover_value = cover.getValue(x1 + (1.0/240.0), - y1 + (1.0/240.0)); - cout << " position: " << x1 << ',' << y1 << ',' - << cover.getDescUSGS(cover_value) << endl; - AreaType area = translateUSGSCover(cover_value); - if (area != DefaultArea) { - // Create a square polygon and merge it into the list. - poly.erase(); - poly.add_node(0, Point3D(x1, y1, 0.0)); - poly.add_node(0, Point3D(x1, y2, 0.0)); - poly.add_node(0, Point3D(x2, y2, 0.0)); - poly.add_node(0, Point3D(x2, y1, 0.0)); - add_to_polys(polys[area], poly); - } + while ( x1 < max_lon - (dx + half_dx) ) { + while ( y1 < max_lat - (dy + half_dy) ) { + make_area( cover, polys, x1, y1, x2, y2, half_dx, half_dy ); y1 = y2; y2 += dy; } + make_area( cover, polys, x1, y1, x2, max_lat, half_dx, half_dy ); + x1 = x2; x2 += dx; y1 = base_lat; y2 = y1 + dy; } + make_area( cover, polys, x1, y1, max_lon, max_lat, half_dx, half_dy ); // Now that we're finished looking up land cover, we have a list // of lists of polygons, one (possibly-empty) list for each area