(running tgvpf --chunk=e020n40 --work-dir=Lakes --material=Lake /home/romosan/scenery/vmaplv0 eurnasia hydro inwatera).
It looks like the program gets into an infinite loop while findind edges for a contour (inserting the same edge over and over until the program runs out of memory). i am not quite sure i understand the code but the following patch solved the problem for me:
This commit is contained in:
parent
a27a7d9367
commit
b635ee443d
2 changed files with 26 additions and 15 deletions
|
@ -77,6 +77,7 @@ VpfContour::getLines () const
|
||||||
const VpfTable &edg = getEDG();
|
const VpfTable &edg = getEDG();
|
||||||
int current_offset = 0;
|
int current_offset = 0;
|
||||||
int current_edge = _start_edge;
|
int current_edge = _start_edge;
|
||||||
|
// std::cout << "start edge: " << _start_edge << std::endl;
|
||||||
int previous_edge = -1;
|
int previous_edge = -1;
|
||||||
do {
|
do {
|
||||||
int row = edg.findMatch("id", current_edge);
|
int row = edg.findMatch("id", current_edge);
|
||||||
|
@ -90,18 +91,32 @@ VpfContour::getLines () const
|
||||||
previous_edge = current_edge;
|
previous_edge = current_edge;
|
||||||
if (edg.getValue(row, "right_face")
|
if (edg.getValue(row, "right_face")
|
||||||
.getCrossRef().current_tile_key == _polygon_id) {
|
.getCrossRef().current_tile_key == _polygon_id) {
|
||||||
info.isLR = true;
|
info.isLR = true;
|
||||||
current_edge = edg.getValue(row, "right_edge")
|
current_edge = edg.getValue(row, "right_edge")
|
||||||
.getCrossRef().current_tile_key;
|
.getCrossRef().current_tile_key;
|
||||||
|
if (edg.getValue(row, "left_face")
|
||||||
|
.getCrossRef().current_tile_key == _polygon_id)
|
||||||
|
std::cout << "right face also left face" << std::endl;
|
||||||
} else if (edg.getValue(row, "left_face")
|
} else if (edg.getValue(row, "left_face")
|
||||||
.getCrossRef().current_tile_key == _polygon_id) {
|
.getCrossRef().current_tile_key == _polygon_id) {
|
||||||
info.isLR = false;
|
info.isLR = false;
|
||||||
current_edge = edg.getValue(row, "left_edge")
|
current_edge = edg.getValue(row, "left_edge")
|
||||||
.getCrossRef().current_tile_key;
|
.getCrossRef().current_tile_key;
|
||||||
} else {
|
} else {
|
||||||
throw VpfException("edge does not belong to face");
|
throw VpfException("edge does not belong to face");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for ( vector<line_info>::reverse_iterator it = _lines->rbegin();
|
||||||
|
it != _lines->rend(); it++ )
|
||||||
|
{
|
||||||
|
if ( it->id == info.id )
|
||||||
|
{
|
||||||
|
std::cout << "eeek!!! infinite loop..." << std::endl;
|
||||||
|
_nPoints -= info.size;
|
||||||
|
return *_lines;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_lines->push_back(info);
|
_lines->push_back(info);
|
||||||
} while (current_edge != _start_edge);
|
} while (current_edge != _start_edge);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,13 @@ using std::string;
|
||||||
VpfTile::VpfTile (VpfTableManager &tableManager,
|
VpfTile::VpfTile (VpfTableManager &tableManager,
|
||||||
const string &path, int tile_id)
|
const string &path, int tile_id)
|
||||||
: VpfComponent(tableManager, path),
|
: VpfComponent(tableManager, path),
|
||||||
_tile_id(tile_id), // FIXME: kludge
|
_tile_id(tile_id),
|
||||||
_face_id(-1),
|
|
||||||
_aft(0),
|
_aft(0),
|
||||||
_fbr(0)
|
_fbr(0)
|
||||||
{
|
{
|
||||||
|
const VpfTable &aft = getAFT();
|
||||||
|
int row = aft.findMatch("id", _tile_id);
|
||||||
|
_face_id = aft.getValue(row, "fac_id").getInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
VpfTile::VpfTile (const VpfTile &tile)
|
VpfTile::VpfTile (const VpfTile &tile)
|
||||||
|
@ -55,12 +57,6 @@ VpfTile::getBoundingRectangle () const
|
||||||
VpfRectangle rect;
|
VpfRectangle rect;
|
||||||
const VpfTable &fbr = getFBR();
|
const VpfTable &fbr = getFBR();
|
||||||
|
|
||||||
if (_face_id == -1) {
|
|
||||||
const VpfTable &aft = getAFT();
|
|
||||||
int row = aft.findMatch("id", _tile_id);
|
|
||||||
_face_id = aft.getValue(row, "fac_id").getInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
int row = fbr.findMatch("id", _face_id);
|
int row = fbr.findMatch("id", _face_id);
|
||||||
rect.minX = fbr.getValue(row, "xmin").getReal();
|
rect.minX = fbr.getValue(row, "xmin").getReal();
|
||||||
rect.minY = fbr.getValue(row, "ymin").getReal();
|
rect.minY = fbr.getValue(row, "ymin").getReal();
|
||||||
|
|
Loading…
Add table
Reference in a new issue