From e2c3b06d59570f73752518ddf66fea034e3d8c71 Mon Sep 17 00:00:00 2001 From: curt <curt> Date: Fri, 9 Jun 2000 03:25:47 +0000 Subject: [PATCH] More bug fixes for airport generation. --- src/Airports/GenAirports/build.cxx | 60 ++++++++++++++++-------------- src/Lib/Geometry/poly_support.cxx | 41 +++++++++++++------- src/Lib/TriangleJRS/tri_support.c | 8 ++-- 3 files changed, 64 insertions(+), 45 deletions(-) diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx index 81892d27..4be28c3b 100644 --- a/src/Airports/GenAirports/build.cxx +++ b/src/Airports/GenAirports/build.cxx @@ -48,6 +48,7 @@ #include <Geometry/trinodes.hxx> #include <Polygon/index.hxx> #include <Polygon/polygon.hxx> +#include <Polygon/split.hxx> #include <Triangulate/trieles.hxx> #include "convex_hull.hxx" @@ -141,18 +142,18 @@ void add_intermediate_nodes( int contour, const Point3D& start, Point3D p0 = start; Point3D p1 = end; - cout << " add_intermediate_nodes()" << endl; + // cout << " add_intermediate_nodes()" << endl; printf(" %.7f %.7f %.7f <=> %.7f %.7f %.7f\n", p0.x(), p0.y(), p0.z(), p1.x(), p1.y(), p1.z() ); double xdist = fabs(p0.x() - p1.x()); double ydist = fabs(p0.y() - p1.y()); - cout << "xdist = " << xdist << " ydist = " << ydist << endl; + // cout << "xdist = " << xdist << " ydist = " << ydist << endl; x_err_min = xdist + 1.0; y_err_min = ydist + 1.0; if ( xdist > ydist ) { - cout << "use y = mx + b" << endl; + // cout << "use y = mx + b" << endl; // sort these in a sensible order Point3D p_min, p_max; @@ -168,28 +169,28 @@ void add_intermediate_nodes( int contour, const Point3D& start, b = p_max.y() - m * p_max.x(); // if ( temp ) { - cout << "m = " << m << " b = " << b << endl; + // cout << "m = " << m << " b = " << b << endl; // } current = nodes.begin(); last = nodes.end(); counter = 0; for ( ; current != last; ++current ) { - cout << counter << endl; + // cout << counter << endl; if ( (current->x() > (p_min.x() + FG_EPSILON)) && (current->x() < (p_max.x() - FG_EPSILON)) ) { - printf("found a potential candidate %.7f %.7f %.7f\n", - current->x(), current->y(), current->z() ); + // printf("found a potential candidate %.7f %.7f %.7f\n", + // current->x(), current->y(), current->z() ); y_err = fabs(current->y() - (m * current->x() + b)); - cout << "y_err = " << y_err << endl; + // cout << "y_err = " << y_err << endl; if ( y_err < tgAirportEpsilon ) { - cout << "FOUND EXTRA SEGMENT NODE (Y)" << endl; - cout << p_min << " < " << *current << " < " - << p_max << endl; + // cout << "FOUND EXTRA SEGMENT NODE (Y)" << endl; + // cout << p_min << " < " << *current << " < " + // << p_max << endl; found_extra = true; if ( y_err < y_err_min ) { extra_index = counter; @@ -200,7 +201,7 @@ void add_intermediate_nodes( int contour, const Point3D& start, ++counter; } } else { - cout << "use x = m1 * y + b1" << endl; + // cout << "use x = m1 * y + b1" << endl; // sort these in a sensible order Point3D p_min, p_max; @@ -217,7 +218,7 @@ void add_intermediate_nodes( int contour, const Point3D& start, // bool temp = true; // if ( temp ) { - cout << " m1 = " << m1 << " b1 = " << b1 << endl; + // cout << " m1 = " << m1 << " b1 = " << b1 << endl; // } // cout << " should = 0 = " << fabs(p_min.x() - (m1 * p_min.y() + b1)) << endl;; @@ -230,20 +231,20 @@ void add_intermediate_nodes( int contour, const Point3D& start, if ( (current->y() > (p_min.y() + FG_EPSILON)) && (current->y() < (p_max.y() - FG_EPSILON)) ) { - printf("found a potential candidate %.7f %.7f %.7f\n", - current->x(), current->y(), current->z() ); + // printf("found a potential candidate %.7f %.7f %.7f\n", + // current->x(), current->y(), current->z() ); x_err = fabs(current->x() - (m1 * current->y() + b1)); - cout << "x_err = " << x_err << endl; + // cout << "x_err = " << x_err << endl; // if ( temp ) { - cout << " (" << counter << ") x_err = " << x_err << endl; + // cout << " (" << counter << ") x_err = " << x_err << endl; // } if ( x_err < tgAirportEpsilon ) { - cout << "FOUND EXTRA SEGMENT NODE (X)" << endl; - cout << p_min << " < " << *current << " < " - << p_max << endl; + // cout << "FOUND EXTRA SEGMENT NODE (X)" << endl; + // cout << p_min << " < " << *current << " < " + // << p_max << endl; found_extra = true; if ( x_err < x_err_min ) { extra_index = counter; @@ -257,8 +258,8 @@ void add_intermediate_nodes( int contour, const Point3D& start, if ( found_extra ) { // recurse with two sub segments - cout << "dividing " << p0 << " " << nodes[extra_index] - << " " << p1 << endl; + // cout << "dividing " << p0 << " " << nodes[extra_index] + // << " " << p1 << endl; add_intermediate_nodes( contour, p0, nodes[extra_index], tmp_nodes, result ); @@ -600,12 +601,14 @@ void build_airport( string airport_raw, string_list& runways_raw, cout << "result_b = " << result_b.contours() << endl; accum = polygon_union( runway_b, accum ); +#if 0 // after clip, but before removing T intersections char tmpa[256], tmpb[256]; sprintf( tmpa, "a%d", i ); sprintf( tmpb, "b%d", i ); write_polygon( result_a, tmpa ); write_polygon( result_b, tmpb ); +#endif // print runway points cout << "clipped runway pts (a)" << endl; @@ -643,7 +646,7 @@ void build_airport( string airport_raw, string_list& runways_raw, // generate convex hull FGPolygon hull = convex_hull(apt_pts); FGPolygon base_poly = polygon_diff( hull, accum ); - write_polygon( base_poly, "base-raw" ); + // write_polygon( base_poly, "base-raw" ); // add segments to polygons to remove any possible "T" // intersections @@ -697,19 +700,21 @@ void build_airport( string airport_raw, string_list& runways_raw, cout << "add nodes/remove dups runway = " << k << endl; rwy_polys[k] = add_nodes_to_poly( rwy_polys[k], tmp_nodes ); +#if 0 char tmp[256]; sprintf( tmp, "r%d", k ); write_polygon( rwy_polys[k], tmp ); +#endif rwy_polys[k] = remove_dups( rwy_polys[k] ); rwy_polys[k] = remove_bad_contours( rwy_polys[k] ); } cout << "add nodes/remove dups base " << endl; base_poly = add_nodes_to_poly( base_poly, tmp_nodes ); - write_polygon( base_poly, "base-add" ); + // write_polygon( base_poly, "base-add" ); base_poly = remove_dups( base_poly ); base_poly = remove_bad_contours( base_poly ); - write_polygon( base_poly, "base-final" ); + // write_polygon( base_poly, "base-final" ); // tesselate the polygons and prepair them for final output @@ -880,6 +885,7 @@ void build_airport( string airport_raw, string_list& runways_raw, write_index( objpath, b, name ); string holepath = root + "/AirportArea"; - long int poly_index = poly_index_next(); - write_boundary( holepath, b, hull, poly_index ); + // long int poly_index = poly_index_next(); + // write_boundary( holepath, b, hull, poly_index ); + split_polygon( holepath, HoleArea, hull ); } diff --git a/src/Lib/Geometry/poly_support.cxx b/src/Lib/Geometry/poly_support.cxx index ee9cb93e..d9b8aa12 100644 --- a/src/Lib/Geometry/poly_support.cxx +++ b/src/Lib/Geometry/poly_support.cxx @@ -360,9 +360,10 @@ void polygon_tesselate( const FGPolygon &p, // edge list (e), and a triangle neighbor list (n). // no new points on boundary (Y), no internal segment // splitting (YY), no quality refinement (q) + // Quite (Q) string tri_options; - tri_options = "pzYYen"; + tri_options = "pzYYenQ"; cout << "Triangulation with options = " << tri_options << endl; triangulate( (char *)tri_options.c_str(), &in, &out, &vorout ); @@ -431,6 +432,13 @@ void polygon_tesselate( const FGPolygon &p, // will modify the points_inside list for your polygon. FGPolygon polygon_tesselate_alt( FGPolygon &p ) { + FGPolygon result; + result.erase(); + + // Bail right away if polygon is empty + if ( p.contours() == 0 ) { + return result; + } // 1. Robustly find a point inside each contour that is not // inside any other contour @@ -447,8 +455,6 @@ FGPolygon polygon_tesselate_alt( FGPolygon &p ) { // 3. Convert the tesselated output to a list of tringles. // basically a polygon with a contour for every triangle - FGPolygon result; - result.erase(); for ( int i = 0; i < (int)trieles.size(); ++i ) { FGTriEle t = trieles[i]; Point3D p1 = nodes[ t.get_n1() ]; @@ -614,9 +620,10 @@ static void contour_tesselate( FGContourNode *node, const FGPolygon &p, // edge list (e), and a triangle neighbor list (n). // no new points on boundary (Y), no internal segment // splitting (YY), no quality refinement (q) + // Quite (Q) string tri_options; - tri_options = "pzYYen"; + tri_options = "pzYYenQ"; cout << "Triangulation with options = " << tri_options << endl; triangulate( (char *)tri_options.c_str(), &in, &out, &vorout ); @@ -716,10 +723,12 @@ static Point3D point_inside_contour( FGContourNode *node, const FGPolygon &p ) { // build list of hole points for ( int i = 0; i < node->get_num_kids(); ++i ) { - contour_num = node->get_kid(i)->get_contour_num(); - hole_pts.push_back( p.get_point_inside( contour_num ) ); - point_list contour = p.get_contour( contour_num ); - hole_polys.add_contour( contour, 1 ); + if ( node->get_kid( i ) != NULL ) { + contour_num = node->get_kid(i)->get_contour_num(); + hole_pts.push_back( p.get_point_inside( contour_num ) ); + point_list contour = p.get_contour( contour_num ); + hole_polys.add_contour( contour, 1 ); + } } triele_list elelist; @@ -828,12 +837,16 @@ static void build_contour_tree( FGContourNode *node, for ( int i = 0; i < node->get_num_kids(); ++i ) { for ( int j = 0; j < node->get_num_kids(); ++j ) { if ( i != j ) { - if ( p.is_inside( i, j ) ) { - // need to remove contour j from the kid list - avail[ node->get_kid( i ) -> get_contour_num() ] = 1; - node->remove_kid( i ); - cout << "removing kid " << i << " which is inside of kid " - << j << endl; + if ( (node->get_kid(i) != NULL)&&(node->get_kid(j) != NULL) ) { + if ( p.is_inside( i, j ) ) { + // need to remove contour j from the kid list + avail[ node->get_kid( i ) -> get_contour_num() ] = 1; + node->remove_kid( i ); + cout << "removing kid " << i + << " which is inside of kid " << j << endl; + } + } else { + // one of these kids is already NULL, skip } } else { // doesn't make sense to check if a contour is inside itself diff --git a/src/Lib/TriangleJRS/tri_support.c b/src/Lib/TriangleJRS/tri_support.c index 7db43b8b..d4234f72 100644 --- a/src/Lib/TriangleJRS/tri_support.c +++ b/src/Lib/TriangleJRS/tri_support.c @@ -34,7 +34,7 @@ void write_tri_data( struct triangulateio *out ) { fprintf(node, "%d 2 %d 0\n", out->numberofpoints, out->numberofpointattributes); for (i = 0; i < out->numberofpoints; ++i) { - fprintf(node, "%d %.6f %.6f %.2f\n", + fprintf(node, "%d %.8f %.8f %.2f\n", i, out->pointlist[2*i], out->pointlist[2*i + 1], 0.0); } fclose(node); @@ -47,7 +47,7 @@ void write_tri_data( struct triangulateio *out ) { fprintf(ele, "%d ", out->trianglelist[i * out->numberofcorners + j]); } for (j = 0; j < out->numberoftriangleattributes; ++j) { - fprintf(ele, "%.6f ", + fprintf(ele, "%.8f ", out->triangleattributelist[i * out->numberoftriangleattributes + j] @@ -67,12 +67,12 @@ void write_tri_data( struct triangulateio *out ) { } fprintf(fp, "%d\n", out->numberofholes); for (i = 0; i < out->numberofholes; ++i) { - fprintf(fp, "%d %.6f %.6f\n", + fprintf(fp, "%d %.8f %.8f\n", i, out->holelist[2*i], out->holelist[2*i + 1]); } fprintf(fp, "%d\n", out->numberofregions); for (i = 0; i < out->numberofregions; ++i) { - fprintf(fp, "%d %.6f %.6f %.6f\n", + fprintf(fp, "%d %.8f %.8f %.8f\n", i, out->regionlist[4*i], out->regionlist[4*i + 1], out->regionlist[4*i + 2]); }