complete tin_backup

This commit is contained in:
张壹 2021-09-22 11:41:57 +08:00
parent 0f94807644
commit f705e487c7
4 changed files with 144 additions and 124 deletions

View File

@ -84,14 +84,22 @@ struct dem_point
} }
}; };
bool compare_dem_point(dem_point *a, dem_point *b) bool compare_dem_point(dem_point *a, dem_point *b) // determination function for std::sort
{ {
if (a->err > b->err) return true; if (a->err > b->err) return true;
return false; return false;
} }
// End DEM definition // End DEM definition
// Start triangle definition /* Start triangle definition
* v2
* /\
* / \
* n2 / \ n1
* / \
* /------------\
* v0 n0 v1
*/
struct triangle struct triangle
{ {
int id; int id;
@ -205,7 +213,7 @@ void flip_neighboring_triangles(triangle *t, triangle *n, int t_id, int n_id)
{ {
t->neigh[t_id]->neigh[i] = t; t->neigh[t_id]->neigh[i] = t;
break; break;
} }
} }
} }
@ -217,7 +225,7 @@ void flip_neighboring_triangles(triangle *t, triangle *n, int t_id, int n_id)
{ {
n->neigh[(n_id+1)%3]->neigh[i] = n; n->neigh[(n_id+1)%3]->neigh[i] = n;
break; break;
} }
} }
} }
@ -258,7 +266,10 @@ void flip_neighboring_triangles(triangle *t, triangle *n, int t_id, int n_id)
{ {
tmp_dem = t->hosted_dem[i]; tmp_dem = t->hosted_dem[i];
tmp_dem->err = fabs(t->interpolate(tmp_dem->x, tmp_dem->y) - tmp_dem->elev); tmp_dem->err = fabs(t->interpolate(tmp_dem->x, tmp_dem->y) - tmp_dem->elev);
} }
std::sort(t->hosted_dem.begin(), t->hosted_dem.end(), compare_dem_point);
std::sort(n->hosted_dem.begin(), n->hosted_dem.end(), compare_dem_point);
return; return;
} }
@ -452,45 +463,22 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
// Prepare the DEM points // Prepare the DEM points
dem_point *tmp_dem = nullptr; dem_point *tmp_dem = nullptr;
std::vector<dem_point*> dem_grid(xnum*ynum); std::vector<dem_point*> dem_tri;
std::vector<dem_point*>::iterator d_iter; std::vector<dem_point*>::iterator d_iter;
for (int i = 0; i < ynum; ++i)
{
for (int j = 0; j < xnum; ++j)
{
dem_grid[j + i*xnum] = new dem_point(xmin + dx*j, ymin + dy*i, dem[j + i*xnum]);
}
}
vertex2dc *tmp_vert = nullptr; vertex2dc *tmp_vert = nullptr;
tmp_vert = new vertex2dc(xmin, ymin, dem_grid[0]->elev, out_verts.size()); // lower left corner tmp_vert = new vertex2dc(xmin, ymin, dem[0], out_verts.size()); // lower left corner
out_verts.push_back(tmp_vert); out_verts.push_back(tmp_vert);
d_iter = dem_grid.begin(); tmp_vert = new vertex2dc(xmax, ymin, dem[xnum-1], out_verts.size()); // lower right corner
tmp_dem = *d_iter; delete tmp_dem;
dem_grid.erase(d_iter);
tmp_vert = new vertex2dc(xmax, ymin, dem_grid[xnum-2]->elev, out_verts.size()); // lower right corner. Note the first location is already erased
out_verts.push_back(tmp_vert); out_verts.push_back(tmp_vert);
d_iter = dem_grid.begin() + (xnum - 2); tmp_vert = new vertex2dc(xmax, ymax, dem[xnum*ynum-1], out_verts.size()); // upper right corner
tmp_dem = *d_iter; delete tmp_dem;
dem_grid.erase(d_iter);
tmp_vert = new vertex2dc(xmax, ymax, dem_grid[xnum*ynum-3]->elev, out_verts.size()); // upper right corner. Note the first two locations are already erased
out_verts.push_back(tmp_vert); out_verts.push_back(tmp_vert);
d_iter = dem_grid.begin() + (xnum*ynum - 3); tmp_vert = new vertex2dc(xmin, ymax, dem[xnum*(ynum-1)], out_verts.size()); // upper left corner
tmp_dem = *d_iter; delete tmp_dem;
dem_grid.erase(d_iter);
tmp_vert = new vertex2dc(xmin, ymax, dem_grid[xnum*(ynum-1) - 2]->elev, out_verts.size()); // upper left corner. Note the first two locations are already erased
out_verts.push_back(tmp_vert); out_verts.push_back(tmp_vert);
d_iter = dem_grid.begin() + (xnum*(ynum-1) - 2);
tmp_dem = *d_iter; delete tmp_dem;
dem_grid.erase(d_iter);
triangle *old_tri = nullptr, *tmp_tri = nullptr; triangle *old_tri = nullptr, *tmp_tri = nullptr;
triangle *cnst_tri[4]; triangle *cnst_tri[4];
std::vector<triangle*>::iterator t_iter; std::vector<triangle*>::iterator t_iter;
@ -513,40 +501,51 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
out_tris[1]->set_neighbor(out_tris[0], nullptr, nullptr); out_tris[1]->set_neighbor(out_tris[0], nullptr, nullptr);
// Find host triangle for all DEM locations // Find host triangle for all DEM locations
for (int i = 0; i < dem_grid.size(); ++i) int tmp_id;
for (int i = 0; i < ynum; ++i)
{ {
for (int t = 0; t < out_tris.size(); ++t) for (int j = 0; j < xnum; ++j)
{ {
if (out_tris[t]->bound_location(dem_grid[i]->x, dem_grid[i]->y)) tmp_id = j + i*xnum;
if (tmp_id != 0 && tmp_id != (xnum-1) && tmp_id != (xnum*ynum-1) && tmp_id != (xnum*(ynum-1)))
{ {
dem_grid[i]->host = out_tris[t]; tmp_dem = new dem_point(xmin + dx*j, ymin + dy*i, dem[j + i*xnum]);
out_tris[t]->hosted_dem.push_back(dem_grid[i]); for (int t = 0; t < out_tris.size(); ++t)
break; // already found, no need to search more {
if (out_tris[t]->bound_location(tmp_dem->x, tmp_dem->y))
{
tmp_dem->host = out_tris[t];
tmp_dem->err = fabs(out_tris[t]->interpolate(tmp_dem->x, tmp_dem->y) - tmp_dem->elev);
out_tris[t]->hosted_dem.push_back(tmp_dem);
break; // already found, no need to search more
}
}
} }
} }
} }
// loop all DEM data to find the location with maximal error // Sort hosted_dem in the desceding order with respect to the error. Add maximal zeros to dem_tri
for (int i = 0; i < dem_grid.size(); ++i) for (int t = 0; t < out_tris.size(); ++t)
{ {
dem_grid[i]->err = fabs(dem_grid[i]->host->interpolate(dem_grid[i]->x, dem_grid[i]->y) - dem_grid[i]->elev); std::sort(out_tris[t]->hosted_dem.begin(), out_tris[t]->hosted_dem.end(), compare_dem_point);
dem_tri.push_back(out_tris[t]->hosted_dem[0]);
} }
// Sort dem_grid in the desceding order with respect to the error // Sort dem_tri
std::sort(dem_grid.begin(), dem_grid.end(), compare_dem_point); std::sort(dem_tri.begin(), dem_tri.end(), compare_dem_point);
while (dem_grid[0]->err >= maxi_err) // quit til the threshold is meet while (dem_tri[0]->err >= maxi_err) // quit til the threshold is meet
{ {
if (err_records != nullptr) if (err_records != nullptr)
{ {
err_records->push_back(dem_grid[0]->err); err_records->push_back(dem_tri[0]->err);
} }
// find the triangle that includes dem_grid[0] and remove it from out_tris // find the triangle that includes dem_tri[0] and remove it from out_tris
for (t_iter = out_tris.begin(); t_iter != out_tris.end(); ) for (t_iter = out_tris.begin(); t_iter != out_tris.end(); )
{ {
old_tri = *t_iter; old_tri = *t_iter;
if (old_tri == dem_grid[0]->host) if (old_tri == dem_tri[0]->host)
{ {
t_iter = out_tris.erase(t_iter); t_iter = out_tris.erase(t_iter);
break; break;
@ -554,10 +553,10 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
else t_iter++; else t_iter++;
} }
// remove dem_grid[0] from its host triangle's hosted DEM list // remove dem_tri[0] from its host triangle's hosted DEM list
for (d_iter = old_tri->hosted_dem.begin(); d_iter != old_tri->hosted_dem.end(); ) for (d_iter = old_tri->hosted_dem.begin(); d_iter != old_tri->hosted_dem.end(); )
{ {
if (dem_grid[0] == *d_iter) if (dem_tri[0] == *d_iter)
{ {
d_iter = old_tri->hosted_dem.erase(d_iter); d_iter = old_tri->hosted_dem.erase(d_iter);
break; break;
@ -566,13 +565,11 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
} }
// create a new vertex // create a new vertex
tmp_vert = new vertex2dc(dem_grid[0]->x, dem_grid[0]->y, dem_grid[0]->elev, out_verts.size()); tmp_vert = new vertex2dc(dem_tri[0]->x, dem_tri[0]->y, dem_tri[0]->elev, out_verts.size());
out_verts.push_back(tmp_vert); out_verts.push_back(tmp_vert);
// Remove dem_grid[0] from the list and delete it // Delete dem_tri[0]
d_iter = dem_grid.begin(); tmp_dem = dem_tri[0]; delete tmp_dem;
tmp_dem = *d_iter; delete tmp_dem;
dem_grid.erase(d_iter);
// build new triangles // build new triangles
tmp_tri = split_triangle(tmp_vert, old_tri, cnst_tri); tmp_tri = split_triangle(tmp_vert, old_tri, cnst_tri);
@ -627,6 +624,14 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
} }
} }
for (int n = 0; n < 4; n++)
{
if (cnst_tri[n] != nullptr)
{
std::sort(cnst_tri[n]->hosted_dem.begin(), cnst_tri[n]->hosted_dem.end(), compare_dem_point);
}
}
// delete the old triangle // delete the old triangle
old_tri->hosted_dem.clear(); old_tri->hosted_dem.clear();
delete old_tri; old_tri = nullptr; delete old_tri; old_tri = nullptr;
@ -652,6 +657,14 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
} }
} }
for (int n = 0; n < 4; n++)
{
if (cnst_tri[n] != nullptr)
{
std::sort(cnst_tri[n]->hosted_dem.begin(), cnst_tri[n]->hosted_dem.end(), compare_dem_point);
}
}
// delete the old triangle // delete the old triangle
old_tri->hosted_dem.clear(); old_tri->hosted_dem.clear();
delete old_tri; old_tri = nullptr; delete old_tri; old_tri = nullptr;
@ -666,28 +679,35 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
} }
} }
// Sort dem_grid in the desceding order with respect to the error // get maximal errors from out_tris and sort dem_tri
std::sort(dem_grid.begin(), dem_grid.end(), compare_dem_point); dem_tri.clear(); dem_tri.reserve(out_tris.size());
for (int t = 0; t < out_tris.size(); t++)
{
if (!out_tris[t]->hosted_dem.empty())
{
dem_tri.push_back(out_tris[t]->hosted_dem[0]);
}
}
std::sort(dem_tri.begin(), dem_tri.end(), compare_dem_point);
} }
if (err_records != nullptr) if (err_records != nullptr)
{ {
err_records->push_back(dem_grid[0]->err); err_records->push_back(dem_tri[0]->err);
} }
// assign triangles index // assign triangles index
for (int i = 0; i < out_tris.size(); i++) for (int i = 0; i < out_tris.size(); i++)
{ {
out_tris[i]->id = i; out_tris[i]->id = i;
// destroy remaining DEM data
for (int d = 0; d < out_tris[i]->hosted_dem.size(); d++)
{
tmp_dem = out_tris[i]->hosted_dem[d];
delete tmp_dem; tmp_dem = nullptr;
}
} }
// destroy remaining DEM data
for (int i = 0; i < dem_grid.size(); ++i)
{
tmp_dem = dem_grid[i];
delete tmp_dem; tmp_dem = nullptr;
}
return; return;
} }

View File

@ -1771,10 +1771,10 @@
1770 1.27677 1770 1.27677
1771 1.2761 1771 1.2761
1772 1.2757 1772 1.2757
1773 2.18047 1773 1.2757
1774 1.52615 1774 2.18047
1775 1.4891 1775 1.52615
1776 1.2757 1776 1.4891
1777 1.27485 1777 1.27485
1778 1.27223 1778 1.27223
1779 1.2677 1779 1.2677

View File

@ -1778,11 +1778,11 @@ $Nodes
1773 920 50 17.9669 1773 920 50 17.9669
1774 540 620 75.4846 1774 540 620 75.4846
1775 600 290 115.525 1775 600 290 115.525
1776 460 690 72.1859 1776 510 670 64.277
1777 470 680 72.4438 1777 460 690 72.1859
1778 460 680 76.85339999999999 1778 470 680 72.4438
1779 470 690 68.5496 1779 460 680 76.85339999999999
1780 510 670 64.277 1780 470 690 68.5496
1781 280 850 45.0064 1781 280 850 45.0064
1782 430 300 46.6647 1782 430 300 46.6647
1783 640 270 93.31440000000001 1783 640 270 93.31440000000001
@ -3959,7 +3959,7 @@ $Elements
1700 2 0 403 1292 106 1700 2 0 403 1292 106
1701 2 0 106 1292 1291 1701 2 0 106 1292 1291
1702 2 0 202 1292 403 1702 2 0 202 1292 403
1703 2 0 1776 1292 202 1703 2 0 1777 1292 202
1704 2 0 987 65 1293 1704 2 0 987 65 1293
1705 2 0 1237 279 1293 1705 2 0 1237 279 1293
1706 2 0 941 987 1293 1706 2 0 941 987 1293
@ -4202,7 +4202,7 @@ $Elements
1943 2 0 1396 1397 1315 1943 2 0 1396 1397 1315
1944 2 0 913 911 1398 1944 2 0 913 911 1398
1945 2 0 911 912 1401 1945 2 0 911 912 1401
1946 2 0 1400 1777 1399 1946 2 0 1400 1778 1399
1947 2 0 202 913 1399 1947 2 0 202 913 1399
1948 2 0 1398 1400 1399 1948 2 0 1398 1400 1399
1949 2 0 911 1401 1398 1949 2 0 911 1401 1398
@ -5245,20 +5245,20 @@ $Elements
2986 2 0 340 1421 1774 2986 2 0 340 1421 1774
2987 2 0 814 203 1775 2987 2 0 814 203 1775
2988 2 0 203 1263 1775 2988 2 0 203 1263 1775
2989 2 0 1292 1776 1291 2989 2 0 109 1776 774
2990 2 0 1291 1776 496 2990 2 0 774 1776 647
2991 2 0 1400 607 1777 2991 2 0 647 1776 476
2992 2 0 1399 1778 202 2992 2 0 1292 1777 1291
2993 2 0 202 1778 1776 2993 2 0 1291 1777 496
2994 2 0 1777 1778 1399 2994 2 0 1400 607 1778
2995 2 0 1776 1778 1777 2995 2 0 1399 1779 202
2996 2 0 496 1779 607 2996 2 0 202 1779 1777
2997 2 0 607 1779 1777 2997 2 0 1778 1779 1399
2998 2 0 1776 1779 496 2998 2 0 1777 1779 1778
2999 2 0 1777 1779 1776 2999 2 0 496 1780 607
3000 2 0 109 1780 774 3000 2 0 607 1780 1778
3001 2 0 774 1780 647 3001 2 0 1777 1780 496
3002 2 0 647 1780 476 3002 2 0 1778 1780 1777
3003 2 0 2035 1781 126 3003 2 0 2035 1781 126
3004 2 0 126 1781 384 3004 2 0 126 1781 384
3005 2 0 1731 1781 385 3005 2 0 1731 1781 385
@ -5589,8 +5589,8 @@ $Elements
3330 2 0 778 362 1894 3330 2 0 778 362 1894
3331 2 0 1105 1769 1895 3331 2 0 1105 1769 1895
3332 2 0 1455 1333 1895 3332 2 0 1455 1333 1895
3333 2 0 109 1896 1780 3333 2 0 109 1896 1776
3334 2 0 1780 1896 476 3334 2 0 1776 1896 476
3335 2 0 607 1896 109 3335 2 0 607 1896 109
3336 2 0 476 1896 1401 3336 2 0 476 1896 1401
3337 2 0 657 2177 1897 3337 2 0 657 2177 1897
@ -8489,11 +8489,11 @@ $NodeData
1773 17.9669 1773 17.9669
1774 75.4846 1774 75.4846
1775 115.525 1775 115.525
1776 72.1859 1776 64.277
1777 72.4438 1777 72.1859
1778 76.85339999999999 1778 72.4438
1779 68.5496 1779 76.85339999999999
1780 64.277 1780 68.5496
1781 45.0064 1781 45.0064
1782 46.6647 1782 46.6647
1783 93.31440000000001 1783 93.31440000000001

View File

@ -226,7 +226,7 @@
225 1384 226 337 225 1384 226 337
226 225 227 1601 226 225 227 1601
227 226 1745 2801 227 226 1745 2801
228 3002 229 1958 228 2991 229 1958
229 228 2152 126 229 228 2152 126
230 405 3336 3335 230 405 3336 3335
231 4239 4238 2672 231 4239 4238 2672
@ -245,7 +245,7 @@
244 243 3097 726 244 243 3097 726
245 4122 4129 4123 245 4122 4129 4123
246 3233 3874 3414 246 3233 3874 3414
247 649 536 2996 247 649 536 2999
248 1126 3665 1125 248 1126 3665 1125
249 428 290 1003 249 428 290 1003
250 4440 4339 3471 250 4440 4339 3471
@ -403,7 +403,7 @@
402 401 404 100 402 401 404 100
403 404 401 464 403 404 401 464
404 402 403 384 404 402 403 384
405 230 2991 1950 405 230 2994 1950
406 235 407 182 406 235 407 182
407 180 2139 406 407 180 2139 406
408 4208 2396 4209 408 4208 2396 4209
@ -437,7 +437,7 @@
436 2459 1234 755 436 2459 1234 755
437 1764 1763 515 437 1764 1763 515
438 3851 1720 1801 438 3851 1720 1801
439 1410 3001 2082 439 1410 2990 2082
440 3502 442 2733 440 3502 442 2733
441 442 3500 1905 441 442 3500 1905
442 440 441 48 442 440 441 48
@ -1697,11 +1697,11 @@
1696 356 1697 382 1696 356 1697 382
1697 3996 3994 1696 1697 3996 3994 1696
1698 1457 738 4 1698 1457 738 4
1699 1701 2990 2050 1699 1701 2993 2050
1700 1702 1701 3073 1700 1702 1701 3073
1701 1700 2989 1699 1701 1700 2992 1699
1702 1703 1700 2095 1702 1703 1700 2095
1703 2989 1702 2993 1703 2992 1702 2996
1704 1369 2307 1706 1704 1369 2307 1706
1705 1771 1578 2306 1705 1771 1578 2306
1706 1045 1704 1578 1706 1045 1704 1578
@ -1944,8 +1944,8 @@
1943 1942 2020 1940 1943 1942 2020 1940
1944 887 1949 881 1944 887 1949 881
1945 882 883 1949 1945 882 883 1949
1946 2991 2994 1948 1946 2994 2997 1948
1947 886 881 2992 1947 886 881 2995
1948 1950 1946 881 1948 1950 1946 881
1949 1945 1950 1944 1949 1945 1950 1944
1950 1948 1949 405 1950 1948 1949 405
@ -2987,20 +2987,20 @@
2986 2008 3985 587 2986 2008 3985 587
2987 1462 2988 1439 2987 1462 2988 1439
2988 1627 712 2987 2988 1627 712 2987
2989 1703 2990 1701 2989 3333 2990 3258
2990 2989 2998 1699 2990 2989 2991 439
2991 405 2997 1946 2991 2990 3334 228
2992 2994 2993 1947 2992 1703 2993 1701
2993 2992 2995 1703 2993 2992 3001 1699
2994 2995 2992 1946 2994 405 3000 1946
2995 2993 2994 2999 2995 2997 2996 1947
2996 2998 2997 247 2996 2995 2998 1703
2997 2996 2999 2991 2997 2998 2995 1946
2998 2999 2996 2990 2998 2996 2997 3002
2999 2997 2998 2995 2999 3001 3000 247
3000 3333 3001 3258 3000 2999 3002 2994
3001 3000 3002 439 3001 3002 2999 2993
3002 3001 3334 228 3002 3000 3001 2998
3003 3753 3004 3754 3003 3753 3004 3754
3004 3003 3006 2355 3004 3003 3006 2355
3005 3006 3753 2858 3005 3006 3753 2858
@ -3256,7 +3256,7 @@
3255 3204 3202 654 3255 3204 3202 654
3256 3258 3257 3335 3256 3258 3257 3335
3257 3256 3259 649 3257 3256 3259 649
3258 651 3256 3000 3258 651 3256 2989
3259 3257 651 800 3259 3257 651 800
3260 2772 2774 3262 3260 2772 2774 3262
3261 4292 19 2774 3261 4292 19 2774
@ -3331,8 +3331,8 @@
3330 2672 662 3220 3330 2672 662 3220
3331 2973 2972 4186 3331 2973 2972 4186
3332 1277 4185 2972 3332 1277 4185 2972
3333 3335 3334 3000 3333 3335 3334 2989
3334 3333 3336 3002 3334 3333 3336 2991
3335 230 3333 3256 3335 230 3333 3256
3336 3334 230 2153 3336 3334 230 2153
3337 4198 4196 3947 3337 4198 4196 3947