1
0
Fork 0

A fix for LFPG problem in expand poly. If there are dups when expanding,

the resultant poly was huge, and I could run out of memory.
For closed polys, remove_dups() after snapping.

Also cleaned up the dump_xxx debug command line switches.
- now 1 based, not 0.
- debug_cp directory is the datasource name, so the directory need
  not exist before running genapt850.
This commit is contained in:
Peter Sadrozinski 2012-03-18 10:09:53 -04:00 committed by Christian Schmitt
parent 225e3e1491
commit 59d30a34e8
2 changed files with 67 additions and 25 deletions

View file

@ -86,10 +86,10 @@ Airport::Airport( int c, char* def)
altitude *= SG_FEET_TO_METER;
boundary = NULL;
dbg_rwy_poly = -1;
dbg_pvmt_poly = -1;
dbg_feat_poly = -1;
dbg_base_poly = -1;
dbg_rwy_poly = 0;
dbg_pvmt_poly = 0;
dbg_feat_poly = 0;
dbg_base_poly = 0;
SG_LOG( SG_GENERAL, SG_DEBUG, "Created airport with icao " << icao << ", control tower " << ct << ", and description " << description );
@ -518,7 +518,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
{
SG_LOG(SG_GENERAL, SG_INFO, "Build Feature Poly " << i + 1 << " of " << features.size() << " : " << features[i]->GetDescription() );
if ( (dbg_feat_poly >= 0) && (i == (unsigned int)dbg_feat_poly) ) {
if ( (dbg_feat_poly > 0) && (i == (unsigned int)dbg_feat_poly-1) ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem feat poly (" << i << ")");
make_shapefiles = true;
@ -601,7 +601,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
SG_LOG(SG_GENERAL, SG_INFO, "Build Pavement " << i + 1 << " of " << pavements.size() << " : " << pavements[i]->GetDescription());
slivers.clear();
if ( (dbg_pvmt_poly >= 0) && (i == (unsigned int)dbg_pvmt_poly) ) {
if ( (dbg_pvmt_poly > 0) && (i == (unsigned int)dbg_pvmt_poly-1) ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem pvmt poly (" << i << ")");
make_shapefiles = true;
@ -810,6 +810,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
TGPolygon poly = rwy_polys[k].get_poly();
poly = snap(poly, gSnap);
poly = remove_dups( poly );
poly = remove_bad_contours( poly );
rwy_polys[k].set_poly( poly );
}
for ( unsigned int k = 0; k < pvmt_polys.size(); ++k )
@ -817,6 +818,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
TGPolygon poly = pvmt_polys[k].get_poly();
poly = snap(poly, gSnap);
poly = remove_dups( poly );
poly = remove_bad_contours( poly );
pvmt_polys[k].set_poly( poly );
}
@ -832,7 +834,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
TGPolygon poly = rwy_polys[i].get_poly();
if ( (dbg_rwy_poly >= 0) && (i == (unsigned int)dbg_rwy_poly) ) {
if ( (dbg_rwy_poly > 0) && (i == (unsigned int)dbg_rwy_poly-1) ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem rwy poly (" << i << ") : " << poly );
tgChopNormalPolygon( "/home/pete", "rwy", poly, false );
@ -860,7 +862,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
TGPolygon poly = pvmt_polys[i].get_poly();
if ( (dbg_pvmt_poly >= 0) && (i == (unsigned int)dbg_pvmt_poly) ) {
if ( (dbg_pvmt_poly > 0) && (i == (unsigned int)dbg_pvmt_poly-1) ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem pvmt poly (" << i << ") : " << poly );
tgChopNormalPolygon( "/home/pete", "pvmt", poly, false );
@ -894,7 +896,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
TGPolygon poly = line_polys[i].get_poly();
if ( (dbg_feat_poly >= 0) && (i == (unsigned int)dbg_feat_poly) ) {
if ( (dbg_feat_poly > 0) && (i == (unsigned int)dbg_feat_poly-1) ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem feat poly (" << i << ") : " << poly );
tgChopNormalPolygon( "/home/pete/", "feat", poly, false );
@ -914,7 +916,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
line_polys[i].set_texcoords( tc );
}
if ( dbg_base_poly >= 0 ) {
if ( dbg_base_poly > 0 ) {
SG_LOG(SG_GENERAL, SG_INFO, "Problem base poly: " << base_poly );
tgChopNormalPolygon( "/home/pete/", "Base", base_poly, false );

View file

@ -363,6 +363,7 @@ void ClosedPoly::Finish()
}
pre_tess = snap( pre_tess, gSnap );
pre_tess = remove_dups( pre_tess );
}
// save memory by deleting unneeded resources
@ -387,13 +388,15 @@ void ClosedPoly::Finish()
int ClosedPoly::BuildBtg( superpoly_list* rwy_polys, texparams_list* texparams, ClipPolyType* accum, poly_list& slivers, TGPolygon* apt_base, TGPolygon* apt_clearing, bool make_shapefiles )
{
TGPolygon base, safe_base;
TGPolygon pre_accum;
string material;
void* ds_id = NULL; // If we are going to build shapefiles
void* l_id = NULL; // datasource and layer IDs
if ( make_shapefiles ) {
char ds_name[128];
sprintf(ds_name, "./cp_debug/problem");
sprintf(ds_name, "./cp_debug");
ds_id = tgShapefileOpenDatasource( ds_name );
}
@ -431,8 +434,8 @@ int ClosedPoly::BuildBtg( superpoly_list* rwy_polys, texparams_list* texparams,
// verify the poly has been generated
if ( pre_tess.contours() )
{
SG_LOG(SG_GENERAL, SG_DEBUG, "BuildBtg: original poly has " << pre_tess.contours() << " contours");
SG_LOG(SG_GENERAL, SG_DEBUG, "BuildBtg: original poly has " << pre_tess.contours() << " contours" << " and " << pre_tess.total_size() << " points" );
// do this before clipping and generating the base
// pre_tess = tgPolygonSimplify( pre_tess );
// pre_tess = reduce_degeneracy( pre_tess );
@ -440,6 +443,18 @@ int ClosedPoly::BuildBtg( superpoly_list* rwy_polys, texparams_list* texparams,
TGSuperPoly sp;
TGTexParams tp;
if ( make_shapefiles ) {
char layer_name[128];
char feature_name[128];
sprintf( layer_name, "original" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "original" );
tgShapefileCreateFeature( ds_id, l_id, pre_tess, feature_name );
pre_accum = *accum;
}
TGPolygon clipped = tgPolygonDiffClipper( pre_tess, *accum );
tgPolygonFindSlivers( clipped, slivers );
@ -453,45 +468,70 @@ int ClosedPoly::BuildBtg( superpoly_list* rwy_polys, texparams_list* texparams,
rwy_polys->push_back( sp );
*accum = tgPolygonUnionClipper( pre_tess, *accum );
// *accum = tgPolygonUnionClipper( clipped, *accum );
/* If debugging this poly, write the poly, and clipped poly and the accum buffer into their own layers */
if (ds_id) {
if ( make_shapefiles ) {
char layer_name[128];
char feature_name[128];
sprintf( layer_name, "original" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "original" );
tgShapefileCreateFeature( ds_id, l_id, pre_tess, feature_name );
sprintf( layer_name, "clipped" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "clipped" );
tgShapefileCreateFeature( ds_id, l_id, clipped, feature_name );
sprintf( layer_name, "accum" );
sprintf( layer_name, "pre_accum" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "accum" );
tgShapefileCreateFeature( ds_id, l_id, *accum, feature_name );
sprintf( feature_name, "pre_accum" );
tgShapefileCreateFeature( ds_id, l_id, pre_accum, feature_name );
tgShapefileCloseDatasource( ds_id );
sprintf( layer_name, "post_accum" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "post_accum" );
tgShapefileCreateFeature( ds_id, l_id, *accum, feature_name );
}
SG_LOG(SG_GENERAL, SG_DEBUG, "tp construct");
tp = TGTexParams( pre_tess.get_pt(0,0), 5.0, 5.0, texture_heading );
texparams->push_back( tp );
if ( apt_base )
{
base = tgPolygonExpand( pre_tess, 20.0);
safe_base = tgPolygonExpand( pre_tess, 50.0);
if ( make_shapefiles ) {
char layer_name[128];
char feature_name[128];
sprintf( layer_name, "exp_base" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "exp_base" );
tgShapefileCreateFeature( ds_id, l_id, base, feature_name );
}
safe_base = tgPolygonExpand( pre_tess, 50.0);
if ( make_shapefiles ) {
char layer_name[128];
char feature_name[128];
SG_LOG(SG_GENERAL, SG_INFO, "expanded safe poly: " << safe_base);
sprintf( layer_name, "exp_safe_base" );
l_id = tgShapefileOpenLayer( ds_id, layer_name );
sprintf( feature_name, "exp_safe_base" );
tgShapefileCreateFeature( ds_id, l_id, safe_base, feature_name );
}
// add this to the airport clearing
*apt_clearing = tgPolygonUnionClipper( safe_base, *apt_clearing);
// and add the clearing to the base
*apt_base = tgPolygonUnionClipper( base, *apt_base );
}
if ( make_shapefiles )
{
tgShapefileCloseDatasource( ds_id );
}
}
}