Added code to chop up extra long line segments.
This commit is contained in:
parent
e6f361eb80
commit
d70c4eca1c
1 changed files with 82 additions and 3 deletions
|
@ -365,6 +365,79 @@ static FGPolygon remove_dups( const FGPolygon &poly ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Traverse a polygon and split edges until they are less than max_len
|
||||||
|
// (specified in meters)
|
||||||
|
static FGPolygon split_long_edges( const FGPolygon &poly, double max_len ) {
|
||||||
|
FGPolygon result;
|
||||||
|
Point3D p0, p1;
|
||||||
|
|
||||||
|
cout << "split_long_edges()" << endl;
|
||||||
|
|
||||||
|
for ( int i = 0; i < poly.contours(); ++i ) {
|
||||||
|
// cout << "contour = " << i << endl;
|
||||||
|
for ( int j = 0; j < poly.contour_size(i) - 1; ++j ) {
|
||||||
|
p0 = poly.get_pt( i, j );
|
||||||
|
p1 = poly.get_pt( i, j + 1 );
|
||||||
|
|
||||||
|
double az1, az2, s;
|
||||||
|
geo_inverse_wgs_84( 0.0,
|
||||||
|
p0.y(), p0.x(), p1.y(), p1.x(),
|
||||||
|
&az1, &az2, &s );
|
||||||
|
cout << "distance = " << s << endl;
|
||||||
|
|
||||||
|
if ( s > max_len ) {
|
||||||
|
int segments = (int)(s / max_len) + 1;
|
||||||
|
cout << "segments = " << segments << endl;
|
||||||
|
|
||||||
|
double dx = (p1.x() - p0.x()) / segments;
|
||||||
|
double dy = (p1.y() - p0.y()) / segments;
|
||||||
|
|
||||||
|
for ( int k = 0; k < segments; ++k ) {
|
||||||
|
Point3D tmp( p0.x() + dx * k, p0.y() + dy * k, 0.0 );
|
||||||
|
cout << tmp << endl;
|
||||||
|
result.add_node( i, tmp );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cout << p0 << endl;
|
||||||
|
result.add_node( i, p0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// end of segment is beginning of next segment
|
||||||
|
}
|
||||||
|
p0 = poly.get_pt( i, poly.contour_size(i) - 1 );
|
||||||
|
p1 = poly.get_pt( i, 0 );
|
||||||
|
|
||||||
|
double az1, az2, s;
|
||||||
|
geo_inverse_wgs_84( 0.0,
|
||||||
|
p0.y(), p0.x(), p1.y(), p1.x(),
|
||||||
|
&az1, &az2, &s );
|
||||||
|
cout << "distance = " << s << endl;
|
||||||
|
|
||||||
|
if ( s > max_len ) {
|
||||||
|
int segments = (int)(s / max_len) + 1;
|
||||||
|
cout << "segments = " << segments << endl;
|
||||||
|
|
||||||
|
double dx = (p1.x() - p0.x()) / segments;
|
||||||
|
double dy = (p1.y() - p0.y()) / segments;
|
||||||
|
|
||||||
|
for ( int k = 0; k < segments; ++k ) {
|
||||||
|
Point3D tmp( p0.x() + dx * k, p0.y() + dy * k, 0.0 );
|
||||||
|
cout << tmp << endl;
|
||||||
|
result.add_node( i, tmp );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cout << p0 << endl;
|
||||||
|
result.add_node( i, p0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// maintain original hole flag setting
|
||||||
|
result.set_hole_flag( i, poly.get_hole_flag( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// remove any degenerate contours
|
// remove any degenerate contours
|
||||||
static FGPolygon remove_bad_contours( const FGPolygon &poly ) {
|
static FGPolygon remove_bad_contours( const FGPolygon &poly ) {
|
||||||
FGPolygon result;
|
FGPolygon result;
|
||||||
|
@ -569,8 +642,7 @@ void build_airport( string airport_raw, string_list& runways_raw,
|
||||||
string surface_flag;
|
string surface_flag;
|
||||||
string material;
|
string material;
|
||||||
for ( int i = 0; i < (int)runways.size(); ++i ) {
|
for ( int i = 0; i < (int)runways.size(); ++i ) {
|
||||||
runway = gen_runway_w_mid( runways[i] );
|
surface_flag = runways[i].surface_flags.substr(1, 1);
|
||||||
surface_flag = runways[i].surface_flags.substr(0, 1);
|
|
||||||
cout << "surface flag = " << surface_flag << endl;
|
cout << "surface flag = " << surface_flag << endl;
|
||||||
if ( surface_flag == "A" ) {
|
if ( surface_flag == "A" ) {
|
||||||
material = "Asphalt";
|
material = "Asphalt";
|
||||||
|
@ -580,8 +652,13 @@ void build_airport( string airport_raw, string_list& runways_raw,
|
||||||
material = "DryLake";
|
material = "DryLake";
|
||||||
} else if ( surface_flag == "T" ) {
|
} else if ( surface_flag == "T" ) {
|
||||||
material = "Grass";
|
material = "Grass";
|
||||||
|
} else {
|
||||||
|
cout << "unknown runway type!" << endl;
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
runway = gen_runway_w_mid( runways[i] );
|
||||||
|
|
||||||
// runway half "a"
|
// runway half "a"
|
||||||
runway_a.erase();
|
runway_a.erase();
|
||||||
runway_a.add_node( 0, runway.get_pt(0, 0) );
|
runway_a.add_node( 0, runway.get_pt(0, 0) );
|
||||||
|
@ -667,7 +744,8 @@ void build_airport( string airport_raw, string_list& runways_raw,
|
||||||
|
|
||||||
// generate convex hull
|
// generate convex hull
|
||||||
FGPolygon hull = convex_hull(apt_pts);
|
FGPolygon hull = convex_hull(apt_pts);
|
||||||
FGPolygon base_poly = polygon_diff( hull, accum );
|
FGPolygon divided_hull = split_long_edges( hull, 500.0 );
|
||||||
|
FGPolygon base_poly = polygon_diff( divided_hull, accum );
|
||||||
// write_polygon( base_poly, "base-raw" );
|
// write_polygon( base_poly, "base-raw" );
|
||||||
|
|
||||||
// add segments to polygons to remove any possible "T"
|
// add segments to polygons to remove any possible "T"
|
||||||
|
@ -820,6 +898,7 @@ void build_airport( string airport_raw, string_list& runways_raw,
|
||||||
FGPolygon tri_poly = rwy_polys[k].get_tris();
|
FGPolygon tri_poly = rwy_polys[k].get_tris();
|
||||||
FGPolygon tri_txs = rwy_polys[k].get_texcoords();
|
FGPolygon tri_txs = rwy_polys[k].get_texcoords();
|
||||||
string material = rwy_polys[k].get_material();
|
string material = rwy_polys[k].get_material();
|
||||||
|
cout << "material = " << material << endl;
|
||||||
for ( int i = 0; i < tri_poly.contours(); ++i ) {
|
for ( int i = 0; i < tri_poly.contours(); ++i ) {
|
||||||
tri_v.clear();
|
tri_v.clear();
|
||||||
tri_tc.clear();
|
tri_tc.clear();
|
||||||
|
|
Loading…
Reference in a new issue