tmp update
This commit is contained in:
@@ -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
|
||||
*
|
||||
|
Reference in New Issue
Block a user