complete tin_backup
This commit is contained in:
parent
0f94807644
commit
f705e487c7
140
tin_backup.h
140
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;
|
||||
@ -259,6 +267,9 @@ 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<double> &dem, double xmin, double xmax, double ym
|
||||
|
||||
// Prepare the DEM points
|
||||
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;
|
||||
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<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);
|
||||
|
||||
// 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 j = 0; j < xnum; ++j)
|
||||
{
|
||||
tmp_id = j + i*xnum;
|
||||
if (tmp_id != 0 && tmp_id != (xnum-1) && tmp_id != (xnum*ynum-1) && tmp_id != (xnum*(ynum-1)))
|
||||
{
|
||||
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(dem_grid[i]->x, dem_grid[i]->y))
|
||||
if (out_tris[t]->bound_location(tmp_dem->x, tmp_dem->y))
|
||||
{
|
||||
dem_grid[i]->host = out_tris[t];
|
||||
out_tris[t]->hosted_dem.push_back(dem_grid[i]);
|
||||
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)
|
||||
{
|
||||
dem_grid[i]->err = fabs(dem_grid[i]->host->interpolate(dem_grid[i]->x, dem_grid[i]->y) - dem_grid[i]->elev);
|
||||
}
|
||||
}
|
||||
|
||||
// Sort dem_grid in the desceding order with respect to the error
|
||||
std::sort(dem_grid.begin(), dem_grid.end(), compare_dem_point);
|
||||
// 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)
|
||||
{
|
||||
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]);
|
||||
}
|
||||
|
||||
while (dem_grid[0]->err >= maxi_err) // quit til the threshold is meet
|
||||
// Sort dem_tri
|
||||
std::sort(dem_tri.begin(), dem_tri.end(), compare_dem_point);
|
||||
|
||||
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<double> &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<double> &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<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
|
||||
old_tri->hosted_dem.clear();
|
||||
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
|
||||
old_tri->hosted_dem.clear();
|
||||
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
|
||||
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 i = 0; i < dem_grid.size(); ++i)
|
||||
for (int d = 0; d < out_tris[i]->hosted_dem.size(); d++)
|
||||
{
|
||||
tmp_dem = dem_grid[i];
|
||||
tmp_dem = out_tris[i]->hosted_dem[d];
|
||||
delete tmp_dem; tmp_dem = nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
56
topo_TIN.msh
56
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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user