tmp update
This commit is contained in:
parent
10bb022a07
commit
0acc5cfb05
17
config.sh
Executable file
17
config.sh
Executable file
@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
cmd=${1}
|
||||
package=libtin
|
||||
stow_dir=/opt/stow
|
||||
target_dir=/usr/local
|
||||
|
||||
if [[ ${cmd} == "configure" && ! -d "build/" ]]; then
|
||||
mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=${stow_dir}/${package} -DCMAKE_BUILD_TYPE=Release
|
||||
elif [[ ${cmd} == "configure" ]]; then
|
||||
cd build && rm -rf * && cmake .. -DCMAKE_INSTALL_PREFIX=${stow_dir}/${package} -DCMAKE_BUILD_TYPE=Release
|
||||
elif [[ ${cmd} == "build" ]]; then
|
||||
cd build && make
|
||||
elif [[ ${cmd} == "install" ]]; then
|
||||
cd build && sudo make install
|
||||
sudo stow --dir=${stow_dir} --target=${target_dir} ${package}
|
||||
fi
|
4213
data/topo_TIN2.log
4213
data/topo_TIN2.log
File diff suppressed because it is too large
Load Diff
16940
data/topo_TIN2.msh
16940
data/topo_TIN2.msh
File diff suppressed because it is too large
Load Diff
8500
data/topo_TIN2.neigh
8500
data/topo_TIN2.neigh
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -16,14 +16,14 @@ int main(int argc, char const *argv[])
|
||||
|
||||
// Set outline polygon
|
||||
std::vector<vertex2dc> valid_area(8);
|
||||
valid_area[0].set(0, 500, 0, 0);
|
||||
valid_area[0].set(-5, 500, 0, 0);
|
||||
valid_area[1].set(58, 365, 0, 1);
|
||||
valid_area[2].set(314, 158, 0, 2);
|
||||
valid_area[3].set(681, 22, 0, 3);
|
||||
valid_area[4].set(942, 105, 0, 4);
|
||||
valid_area[5].set(1000, 360, 0, 5);
|
||||
valid_area[6].set(1000, 1000, 0, 6);
|
||||
valid_area[7].set(0, 1000, 0, 7);
|
||||
valid_area[5].set(1005, 360, 0, 5);
|
||||
valid_area[6].set(1005, 1005, 0, 6);
|
||||
valid_area[7].set(-5, 1005, 0, 7);
|
||||
|
||||
std::vector<double> err_records;
|
||||
std::vector<vertex2dc*> tin_vert;
|
||||
|
@ -16,14 +16,14 @@ int main(int argc, char const *argv[])
|
||||
|
||||
// Set outline polygon
|
||||
std::vector<vertex2dc> valid_area(8);
|
||||
valid_area[0].set(0, 500, 0, 0);
|
||||
valid_area[0].set(-5, 500, 0, 0);
|
||||
valid_area[1].set(58, 365, 0, 1);
|
||||
valid_area[2].set(314, 158, 0, 2);
|
||||
valid_area[3].set(681, 22, 0, 3);
|
||||
valid_area[4].set(942, 105, 0, 4);
|
||||
valid_area[5].set(1000, 360, 0, 5);
|
||||
valid_area[6].set(1000, 1000, 0, 6);
|
||||
valid_area[7].set(0, 1000, 0, 7);
|
||||
valid_area[5].set(1005, 360, 0, 5);
|
||||
valid_area[6].set(1005, 1005, 0, 6);
|
||||
valid_area[7].set(-5, 1005, 0, 7);
|
||||
|
||||
std::vector<double> err_records;
|
||||
std::vector<vertex2dc*> tin_vert;
|
||||
|
168
src/lib/tin.cpp
168
src/lib/tin.cpp
@ -431,12 +431,11 @@ triangle *split_triangle(vertex2dc *v, triangle *t, triangle *new_t[4])
|
||||
}
|
||||
// End triangle definition
|
||||
|
||||
|
||||
/**
|
||||
* @brief Test if the input triangle is inside of the given polygon
|
||||
*
|
||||
* @param tri_p Pointer of a test triangle
|
||||
* @param poly_vert Vertexes of a polygon
|
||||
* @param poly_vert Vertexes of a polygon. The vertexes should be orderly stored
|
||||
* @return true The test triangle is inside of the polygon
|
||||
* @return false The test triangle is outside of the polygon
|
||||
*/
|
||||
@ -445,7 +444,7 @@ bool triangle_inside_polygon(triangle *tri_p, std::vector<vertex2dc> *poly_vert)
|
||||
// If any vertexes of the input triangle is outside of the polygon, return false. Otherwise, return true
|
||||
if (poly_vert->size() < 3)
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -475,21 +474,23 @@ bool triangle_inside_polygon(triangle *tri_p, std::vector<vertex2dc> *poly_vert)
|
||||
else
|
||||
{
|
||||
count = 0;
|
||||
|
||||
for (int i = 0; i < pnum; ++i)
|
||||
{
|
||||
if ((one_p->y >= poly_vert->at(i).y && one_p->y < poly_vert->at((i+1)%pnum).y) ||
|
||||
(one_p->y <= poly_vert->at(i).y && one_p->y > poly_vert->at((i+1)%pnum).y))
|
||||
if (((one_p->y >= poly_vert->at(i).y && one_p->y < poly_vert->at((i+1)%pnum).y) ||
|
||||
(one_p->y <= poly_vert->at(i).y && one_p->y > poly_vert->at((i+1)%pnum).y)) &&
|
||||
poly_vert->at(i).y != poly_vert->at((i+1)%pnum).y)
|
||||
{
|
||||
tmp_x = (poly_vert->at((i+1)%pnum).x - poly_vert->at(i).x)
|
||||
* (one_p->y - poly_vert->at(i).y)/(poly_vert->at((i+1)%pnum).y - poly_vert->at(i).y)
|
||||
+ poly_vert->at(i).x;
|
||||
|
||||
if (one_p->x <= tmp_x)
|
||||
if (one_p->x < tmp_x)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (pow(-1, count) > 0) return false;
|
||||
if (count != 0 && pow(-1, count) > 0) return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -498,6 +499,69 @@ bool triangle_inside_polygon(triangle *tri_p, std::vector<vertex2dc> *poly_vert)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Test if the input locaiton is inside of the given polygon
|
||||
*
|
||||
* @param x Input x coordinate
|
||||
* @param y Input y coordinate
|
||||
* @param poly_vert Vertexes of a polygon. The vertexes should be orderly stored
|
||||
* @return true The test triangle is inside of the polygon
|
||||
* @return false The test triangle is outside of the polygon
|
||||
*/
|
||||
bool location_inside_polygon(double x, double y, std::vector<vertex2dc> *poly_vert)
|
||||
{
|
||||
// If any vertexes of the input triangle is outside of the polygon, return false. Otherwise, return true
|
||||
if (poly_vert->size() < 3)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
int pnum = poly_vert->size();
|
||||
//确定外接矩形
|
||||
double xmin = poly_vert->at(0).x, ymin = poly_vert->at(0).y;
|
||||
double xmax = poly_vert->at(0).x, ymax = poly_vert->at(0).y;
|
||||
for (int j = 0; j < pnum; ++j)
|
||||
{
|
||||
xmin = std::min(xmin, poly_vert->at(j).x);
|
||||
xmax = std::max(xmax, poly_vert->at(j).x);
|
||||
ymin = std::min(ymin, poly_vert->at(j).y);
|
||||
ymax = std::max(ymax, poly_vert->at(j).y);
|
||||
}
|
||||
|
||||
int count;
|
||||
double tmp_x;
|
||||
|
||||
// the testing point is outside of the surrounding box, return false
|
||||
if (x < xmin || x > xmax || y < ymin || y > ymax)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
count = 0;
|
||||
|
||||
for (int i = 0; i < pnum; ++i)
|
||||
{
|
||||
if (((y >= poly_vert->at(i).y && y < poly_vert->at((i+1)%pnum).y) ||
|
||||
(y <= poly_vert->at(i).y && y > poly_vert->at((i+1)%pnum).y)) &&
|
||||
poly_vert->at(i).y != poly_vert->at((i+1)%pnum).y)
|
||||
{
|
||||
tmp_x = (poly_vert->at((i+1)%pnum).x - poly_vert->at(i).x)
|
||||
* (y - poly_vert->at(i).y)/(poly_vert->at((i+1)%pnum).y - poly_vert->at(i).y)
|
||||
+ poly_vert->at(i).x;
|
||||
|
||||
if (x < tmp_x) count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count != 0 && pow(-1, count) > 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Generate the TIN from the DEM grid
|
||||
@ -571,22 +635,51 @@ void dem2tin(const std::vector<double> &dem, double xmin, double xmax, double ym
|
||||
|
||||
// Find host triangle for all DEM locations
|
||||
int tmp_id;
|
||||
for (int i = 0; i < ynum; ++i)
|
||||
if (outline_poly == nullptr)
|
||||
{
|
||||
for (int j = 0; j < xnum; ++j)
|
||||
for (int i = 0; i < ynum; ++i)
|
||||
{
|
||||
tmp_id = j + i*xnum;
|
||||
if (tmp_id != 0 && tmp_id != (xnum-1) && tmp_id != (xnum*ynum-1) && tmp_id != (xnum*(ynum-1))) // the four corners are already used
|
||||
for (int j = 0; j < xnum; ++j)
|
||||
{
|
||||
tmp_dem = new dem_point(xmin + dx*j, ymin + dy*i, dem[j + i*xnum]);
|
||||
for (int t = 0; t < out_tris.size(); ++t)
|
||||
tmp_id = j + i*xnum;
|
||||
if (tmp_id != 0 && tmp_id != (xnum-1) && tmp_id != (xnum*ynum-1) && tmp_id != (xnum*(ynum-1))) // the four corners are already used
|
||||
{
|
||||
if (out_tris[t]->bound_location(tmp_dem->x, tmp_dem->y))
|
||||
tmp_dem = new dem_point(xmin + dx*j, ymin + dy*i, dem[j + i*xnum]);
|
||||
for (int t = 0; t < out_tris.size(); ++t)
|
||||
{
|
||||
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
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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)) &&
|
||||
location_inside_polygon(xmin+dx*j, ymin+dy*i, outline_poly)) // the four corners are already used
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -890,17 +983,40 @@ void rnd2tin(const std::vector<dem_point> &dem, std::vector<vertex2dc*> &out_ver
|
||||
std::vector<dem_point*>::iterator d_iter;
|
||||
|
||||
// Find host triangle for all DEM locations
|
||||
for (int d = 0; d < dem.size(); ++d)
|
||||
if (outline_poly == nullptr)
|
||||
{
|
||||
tmp_dem = new dem_point(dem[d].x, dem[d].y, dem[d].elev);
|
||||
for (int t = 0; t < out_tris.size(); ++t)
|
||||
for (int d = 0; d < dem.size(); ++d)
|
||||
{
|
||||
if (out_tris[t]->bound_location(tmp_dem->x, tmp_dem->y))
|
||||
tmp_dem = new dem_point(dem[d].x, dem[d].y, dem[d].elev);
|
||||
for (int t = 0; t < out_tris.size(); ++t)
|
||||
{
|
||||
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
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int d = 0; d < dem.size(); ++d)
|
||||
{
|
||||
if (location_inside_polygon(dem[d].x, dem[d].y, outline_poly))
|
||||
{
|
||||
tmp_dem = new dem_point(dem[d].x, dem[d].y, dem[d].elev);
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,16 +184,6 @@ struct triangle
|
||||
};
|
||||
// End triangle definition
|
||||
|
||||
/**
|
||||
* @brief Test if the input triangle is inside of the given polygon
|
||||
*
|
||||
* @param tri_p Pointer of a test triangle
|
||||
* @param poly_vert Vertexes of a polygon
|
||||
* @return true The test triangle is inside of the polygon
|
||||
* @return false The test triangle is outside of the polygon
|
||||
*/
|
||||
bool triangle_inside_polygon(triangle *tri_p, std::vector<vertex2dc> *poly_vert);
|
||||
|
||||
/**
|
||||
* @brief Generate the TIN from a dense DEM grid
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user