fix polygon handling
This commit is contained in:
parent
8d980d434e
commit
0781f230be
1 changed files with 45 additions and 20 deletions
|
@ -41,42 +41,67 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
double x0, y0;
|
geometry::point<double> p0;
|
||||||
unsigned command0 = this->locator_.vertex(&x0, &y0);
|
geometry::point<double> p1;
|
||||||
|
geometry::point<double> p_next;
|
||||||
|
geometry::point<double> move_to;
|
||||||
|
unsigned cmd0 = SEG_END;
|
||||||
|
unsigned cmd1 = SEG_END;
|
||||||
|
unsigned cmd_next = SEG_END;
|
||||||
|
|
||||||
if (agg::is_stop(command0))
|
while ((cmd_next = this->locator_.vertex(&p_next.x, &p_next.y)) != SEG_END)
|
||||||
|
{
|
||||||
|
switch (cmd_next)
|
||||||
|
{
|
||||||
|
case SEG_MOVETO:
|
||||||
|
move_to = p_next;
|
||||||
|
p0 = p_next;
|
||||||
|
cmd0 = cmd_next;
|
||||||
|
break;
|
||||||
|
case SEG_LINETO:
|
||||||
|
p1 = p0;
|
||||||
|
cmd1 = cmd0;
|
||||||
|
p0 = p_next;
|
||||||
|
cmd0 = cmd_next;
|
||||||
|
break;
|
||||||
|
case SEG_CLOSE:
|
||||||
|
p1 = p0;
|
||||||
|
cmd1 = cmd0;
|
||||||
|
p0 = move_to;
|
||||||
|
cmd0 = cmd_next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty geometry
|
||||||
|
if (cmd0 == SEG_END)
|
||||||
{
|
{
|
||||||
this->done_ = true;
|
this->done_ = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
double next_x, next_y;
|
// Last point
|
||||||
double x1 = x0, y1 = y0;
|
x = p0.x;
|
||||||
unsigned command1 = command0;
|
y = p0.y;
|
||||||
|
|
||||||
while (!agg::is_stop(command0 = this->locator_.vertex(&next_x, &next_y)))
|
// Line or polygon
|
||||||
|
if (cmd0 == SEG_LINETO || cmd0 == SEG_CLOSE)
|
||||||
{
|
{
|
||||||
command1 = command0;
|
angle = std::atan2(p0.y - p1.y, p0.x - p1.x);
|
||||||
x1 = x0;
|
|
||||||
y1 = y0;
|
|
||||||
x0 = next_x;
|
|
||||||
y0 = next_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
x = x0;
|
|
||||||
y = y0;
|
|
||||||
|
|
||||||
if (agg::is_line_to(command1))
|
|
||||||
{
|
|
||||||
angle = std::atan2(y0 - y1, x0 - x1);
|
|
||||||
if (!this->set_direction(angle))
|
if (!this->set_direction(angle))
|
||||||
{
|
{
|
||||||
|
this->done_ = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
angle = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!this->push_to_detector(x, y, angle, ignore_placement))
|
if (!this->push_to_detector(x, y, angle, ignore_placement))
|
||||||
{
|
{
|
||||||
|
this->done_ = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue