Fix radial-distance simplification algorithm to always oupput last vertex (ref #4347)

This commit is contained in:
Artem Pavlenko 2022-09-23 09:41:11 +01:00
parent 9e8e178160
commit 9cf40a6144

View file

@ -184,6 +184,7 @@ struct simplify_converter
unsigned output_vertex_distance(double* x, double* y) unsigned output_vertex_distance(double* x, double* y)
{ {
if (status_ == done) return SEG_END;
if (status_ == closing) if (status_ == closing)
{ {
*x = *y = 0.0; *x = *y = 0.0;
@ -195,7 +196,12 @@ struct simplify_converter
vertex2d vtx(vertex2d::no_init); vertex2d vtx(vertex2d::no_init);
while ((vtx.cmd = geom_.vertex(&vtx.x, &vtx.y)) != SEG_END) while ((vtx.cmd = geom_.vertex(&vtx.x, &vtx.y)) != SEG_END)
{ {
if (vtx.cmd == SEG_LINETO) if (vtx.cmd == SEG_MOVETO)
{
start_vertex_ = vtx;
break;
}
else if (vtx.cmd == SEG_LINETO)
{ {
if (distance_to_previous(vtx) > tolerance_) if (distance_to_previous(vtx) > tolerance_)
{ {
@ -227,16 +233,18 @@ struct simplify_converter
} }
break; break;
} }
else if (vtx.cmd == SEG_MOVETO)
{
start_vertex_ = vtx;
break;
}
else else
{ {
throw std::runtime_error("Unknown vertex command"); throw std::runtime_error("Unknown vertex command");
} }
} }
if (vtx.cmd == SEG_END && last.cmd != SEG_END)
{
status_ = done;
*x = last.x;
*y = last.y;
return SEG_LINETO;
}
previous_vertex_ = vtx; previous_vertex_ = vtx;
*x = vtx.x; *x = vtx.x;