From f705e487c7d8203fb49270e2ace25c2d18bbe5a6 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Wed, 22 Sep 2021 11:41:57 +0800 Subject: [PATCH] complete tin_backup --- tin_backup.h | 152 ++++++++++++++++++++++++++++--------------------- topo_TIN.log | 8 +-- topo_TIN.msh | 56 +++++++++--------- topo_TIN.neigh | 52 ++++++++--------- 4 files changed, 144 insertions(+), 124 deletions(-) diff --git a/tin_backup.h b/tin_backup.h index 9dc5391..263ff39 100644 --- a/tin_backup.h +++ b/tin_backup.h @@ -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; return false; } // End DEM definition -// Start triangle definition +/* Start triangle definition + * v2 + * /\ + * / \ + * n2 / \ n1 + * / \ + * /------------\ + * v0 n0 v1 + */ struct triangle { 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; 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; 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->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; } @@ -452,45 +463,22 @@ void dem2tin(const std::vector &dem, double xmin, double xmax, double ym // Prepare the DEM points dem_point *tmp_dem = nullptr; - std::vector dem_grid(xnum*ynum); + std::vector dem_tri; std::vector::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; - 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); - d_iter = dem_grid.begin(); - 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 + tmp_vert = new vertex2dc(xmax, ymin, dem[xnum-1], out_verts.size()); // lower right corner out_verts.push_back(tmp_vert); - d_iter = dem_grid.begin() + (xnum - 2); - 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 + tmp_vert = new vertex2dc(xmax, ymax, dem[xnum*ynum-1], out_verts.size()); // upper right corner out_verts.push_back(tmp_vert); - d_iter = dem_grid.begin() + (xnum*ynum - 3); - 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 + tmp_vert = new vertex2dc(xmin, ymax, dem[xnum*(ynum-1)], out_verts.size()); // upper left corner 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 *cnst_tri[4]; std::vector::iterator t_iter; @@ -513,40 +501,51 @@ void dem2tin(const std::vector &dem, double xmin, double xmax, double ym out_tris[1]->set_neighbor(out_tris[0], nullptr, nullptr); // 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]; - out_tris[t]->hosted_dem.push_back(dem_grid[i]); - break; // already found, no need to search more + tmp_dem = new dem_point(xmin + dx*j, ymin + dy*i, dem[j + i*xnum]); + for (int t = 0; t < out_tris.size(); ++t) + { + 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 - for (int i = 0; i < dem_grid.size(); ++i) + // Sort hosted_dem in the desceding order with respect to the error. Add maximal zeros to dem_tri + 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 - std::sort(dem_grid.begin(), dem_grid.end(), compare_dem_point); + // Sort dem_tri + 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) { - 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(); ) { 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); break; @@ -554,10 +553,10 @@ void dem2tin(const std::vector &dem, double xmin, double xmax, double ym 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(); ) { - if (dem_grid[0] == *d_iter) + if (dem_tri[0] == *d_iter) { d_iter = old_tri->hosted_dem.erase(d_iter); break; @@ -566,13 +565,11 @@ void dem2tin(const std::vector &dem, double xmin, double xmax, double ym } // 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); - // Remove dem_grid[0] from the list and delete it - d_iter = dem_grid.begin(); - tmp_dem = *d_iter; delete tmp_dem; - dem_grid.erase(d_iter); + // Delete dem_tri[0] + tmp_dem = dem_tri[0]; delete tmp_dem; // build new triangles tmp_tri = split_triangle(tmp_vert, old_tri, cnst_tri); @@ -627,6 +624,14 @@ void dem2tin(const std::vector &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 old_tri->hosted_dem.clear(); delete old_tri; old_tri = nullptr; @@ -652,6 +657,14 @@ void dem2tin(const std::vector &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 old_tri->hosted_dem.clear(); delete old_tri; old_tri = nullptr; @@ -666,28 +679,35 @@ void dem2tin(const std::vector &dem, double xmin, double xmax, double ym } } - // Sort dem_grid in the desceding order with respect to the error - std::sort(dem_grid.begin(), dem_grid.end(), compare_dem_point); + // get maximal errors from out_tris and sort dem_tri + 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) { - err_records->push_back(dem_grid[0]->err); + err_records->push_back(dem_tri[0]->err); } // assign triangles index for (int i = 0; i < out_tris.size(); 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; } diff --git a/topo_TIN.log b/topo_TIN.log index a9dbafc..485bceb 100644 --- a/topo_TIN.log +++ b/topo_TIN.log @@ -1771,10 +1771,10 @@ 1770 1.27677 1771 1.2761 1772 1.2757 -1773 2.18047 -1774 1.52615 -1775 1.4891 -1776 1.2757 +1773 1.2757 +1774 2.18047 +1775 1.52615 +1776 1.4891 1777 1.27485 1778 1.27223 1779 1.2677 diff --git a/topo_TIN.msh b/topo_TIN.msh index 4f391da..8250854 100644 --- a/topo_TIN.msh +++ b/topo_TIN.msh @@ -1778,11 +1778,11 @@ $Nodes 1773 920 50 17.9669 1774 540 620 75.4846 1775 600 290 115.525 -1776 460 690 72.1859 -1777 470 680 72.4438 -1778 460 680 76.85339999999999 -1779 470 690 68.5496 -1780 510 670 64.277 +1776 510 670 64.277 +1777 460 690 72.1859 +1778 470 680 72.4438 +1779 460 680 76.85339999999999 +1780 470 690 68.5496 1781 280 850 45.0064 1782 430 300 46.6647 1783 640 270 93.31440000000001 @@ -3959,7 +3959,7 @@ $Elements 1700 2 0 403 1292 106 1701 2 0 106 1292 1291 1702 2 0 202 1292 403 -1703 2 0 1776 1292 202 +1703 2 0 1777 1292 202 1704 2 0 987 65 1293 1705 2 0 1237 279 1293 1706 2 0 941 987 1293 @@ -4202,7 +4202,7 @@ $Elements 1943 2 0 1396 1397 1315 1944 2 0 913 911 1398 1945 2 0 911 912 1401 -1946 2 0 1400 1777 1399 +1946 2 0 1400 1778 1399 1947 2 0 202 913 1399 1948 2 0 1398 1400 1399 1949 2 0 911 1401 1398 @@ -5245,20 +5245,20 @@ $Elements 2986 2 0 340 1421 1774 2987 2 0 814 203 1775 2988 2 0 203 1263 1775 -2989 2 0 1292 1776 1291 -2990 2 0 1291 1776 496 -2991 2 0 1400 607 1777 -2992 2 0 1399 1778 202 -2993 2 0 202 1778 1776 -2994 2 0 1777 1778 1399 -2995 2 0 1776 1778 1777 -2996 2 0 496 1779 607 -2997 2 0 607 1779 1777 -2998 2 0 1776 1779 496 -2999 2 0 1777 1779 1776 -3000 2 0 109 1780 774 -3001 2 0 774 1780 647 -3002 2 0 647 1780 476 +2989 2 0 109 1776 774 +2990 2 0 774 1776 647 +2991 2 0 647 1776 476 +2992 2 0 1292 1777 1291 +2993 2 0 1291 1777 496 +2994 2 0 1400 607 1778 +2995 2 0 1399 1779 202 +2996 2 0 202 1779 1777 +2997 2 0 1778 1779 1399 +2998 2 0 1777 1779 1778 +2999 2 0 496 1780 607 +3000 2 0 607 1780 1778 +3001 2 0 1777 1780 496 +3002 2 0 1778 1780 1777 3003 2 0 2035 1781 126 3004 2 0 126 1781 384 3005 2 0 1731 1781 385 @@ -5589,8 +5589,8 @@ $Elements 3330 2 0 778 362 1894 3331 2 0 1105 1769 1895 3332 2 0 1455 1333 1895 -3333 2 0 109 1896 1780 -3334 2 0 1780 1896 476 +3333 2 0 109 1896 1776 +3334 2 0 1776 1896 476 3335 2 0 607 1896 109 3336 2 0 476 1896 1401 3337 2 0 657 2177 1897 @@ -8489,11 +8489,11 @@ $NodeData 1773 17.9669 1774 75.4846 1775 115.525 -1776 72.1859 -1777 72.4438 -1778 76.85339999999999 -1779 68.5496 -1780 64.277 +1776 64.277 +1777 72.1859 +1778 72.4438 +1779 76.85339999999999 +1780 68.5496 1781 45.0064 1782 46.6647 1783 93.31440000000001 diff --git a/topo_TIN.neigh b/topo_TIN.neigh index be71bf7..dece851 100644 --- a/topo_TIN.neigh +++ b/topo_TIN.neigh @@ -226,7 +226,7 @@ 225 1384 226 337 226 225 227 1601 227 226 1745 2801 -228 3002 229 1958 +228 2991 229 1958 229 228 2152 126 230 405 3336 3335 231 4239 4238 2672 @@ -245,7 +245,7 @@ 244 243 3097 726 245 4122 4129 4123 246 3233 3874 3414 -247 649 536 2996 +247 649 536 2999 248 1126 3665 1125 249 428 290 1003 250 4440 4339 3471 @@ -403,7 +403,7 @@ 402 401 404 100 403 404 401 464 404 402 403 384 -405 230 2991 1950 +405 230 2994 1950 406 235 407 182 407 180 2139 406 408 4208 2396 4209 @@ -437,7 +437,7 @@ 436 2459 1234 755 437 1764 1763 515 438 3851 1720 1801 -439 1410 3001 2082 +439 1410 2990 2082 440 3502 442 2733 441 442 3500 1905 442 440 441 48 @@ -1697,11 +1697,11 @@ 1696 356 1697 382 1697 3996 3994 1696 1698 1457 738 4 -1699 1701 2990 2050 +1699 1701 2993 2050 1700 1702 1701 3073 -1701 1700 2989 1699 +1701 1700 2992 1699 1702 1703 1700 2095 -1703 2989 1702 2993 +1703 2992 1702 2996 1704 1369 2307 1706 1705 1771 1578 2306 1706 1045 1704 1578 @@ -1944,8 +1944,8 @@ 1943 1942 2020 1940 1944 887 1949 881 1945 882 883 1949 -1946 2991 2994 1948 -1947 886 881 2992 +1946 2994 2997 1948 +1947 886 881 2995 1948 1950 1946 881 1949 1945 1950 1944 1950 1948 1949 405 @@ -2987,20 +2987,20 @@ 2986 2008 3985 587 2987 1462 2988 1439 2988 1627 712 2987 -2989 1703 2990 1701 -2990 2989 2998 1699 -2991 405 2997 1946 -2992 2994 2993 1947 -2993 2992 2995 1703 -2994 2995 2992 1946 -2995 2993 2994 2999 -2996 2998 2997 247 -2997 2996 2999 2991 -2998 2999 2996 2990 -2999 2997 2998 2995 -3000 3333 3001 3258 -3001 3000 3002 439 -3002 3001 3334 228 +2989 3333 2990 3258 +2990 2989 2991 439 +2991 2990 3334 228 +2992 1703 2993 1701 +2993 2992 3001 1699 +2994 405 3000 1946 +2995 2997 2996 1947 +2996 2995 2998 1703 +2997 2998 2995 1946 +2998 2996 2997 3002 +2999 3001 3000 247 +3000 2999 3002 2994 +3001 3002 2999 2993 +3002 3000 3001 2998 3003 3753 3004 3754 3004 3003 3006 2355 3005 3006 3753 2858 @@ -3256,7 +3256,7 @@ 3255 3204 3202 654 3256 3258 3257 3335 3257 3256 3259 649 -3258 651 3256 3000 +3258 651 3256 2989 3259 3257 651 800 3260 2772 2774 3262 3261 4292 19 2774 @@ -3331,8 +3331,8 @@ 3330 2672 662 3220 3331 2973 2972 4186 3332 1277 4185 2972 -3333 3335 3334 3000 -3334 3333 3336 3002 +3333 3335 3334 2989 +3334 3333 3336 2991 3335 230 3333 3256 3336 3334 230 2153 3337 4198 4196 3947