# Geometry :

From: qxc_at_[hidden]
Date: 2021-03-31 11:42:45

Hi,

I have a problem with the resize() function which is used in order to provide a bigger or smaller copy of the current polygon. The input polygon is shown in attached image shape.png, it is a rectangle with two other rectangles that form a hole. All rectangles are oriented clockwise, these are the coordinates:

-36486 26031 0
-8220 26031 1
-8220 4409 1
-36486 4409 1
-36486 26031 1
-32983 21078 0
-28031 21078 1
-28031 16730 1
-32983 16730 1
-32983 21078 1
-16555 10932 0
-11240 10932 1
-11240 7187 1
-16555 7187 1
-16555 10932 1

When I do a resize() with a positive value in parameter resizing, the result is as per clip_inner.png (the red filled area shows the resize-result), when a "resizing" is set to a negative value, the result is as in attached image clip_outer.png. In both cases the first hole is somehow overlapped.

My code (simplified to the minimum) to resize the polygon looks like this:

boost::polygon::polygon_with_holes_data<int> data;
boost::polygon::polygon_with_holes_data<int> opData;

boost::polygon::polygon_data<int> hole;
std::vector<boost::polygon::polygon_data<int>> holes;
std::vector<std::vector<boost::polygon::point_data<int>>> outlines;

std::vector<boost::polygon::point_data<int>> outline;

outlines.push_back(outline);
for (i=0; i<planeNum; i++)
{
outlines[polyCnt].push_back(boost::polygon::point_data<int>((int)(plane[i].x*10000),(int)(plane[i].y*10000)));
}

outline.clear();

outlines.push_back(outline);
if (i<planeNum-1) for (; i<planeNum; i++)
{
outlines[polyCnt].push_back(boost::polygon::point_data<int>((int)(plane[i].x*10000),(int)(plane[i].y*10000)));
if ((plane[i].flags...)
{
// end of one hole, beginning of next one, switch data
...
}
outlines.push_back(outline);
}
data->set_holes(holes.begin(),holes.end());

if (outlines[outlines.size()-1].empty()) outlines.pop_back();

for (i=0; i<outlines.size(); i++)
{
if (i==maxPoly) data->set(outlines[i].begin(),outlines[i].end());
else
{
hole.set(outlines[i].begin(),outlines[i].end());
holes.push_back(hole);
}
}
data->set_holes(holes.begin(),holes.end());

Then resizing is done e.g. this way:

boost::polygon::polygon_set_data<int> result;

opData=data;
result=opData+data;
clip->result=result.resize((int)(distance*10000.0,0));

Any idea what may go wrong here?

Thanks!

Geometry list run by mateusz at loskot.net