• Create Account

Awesome job so far everyone! Please give us your feedback on how our article efforts are going. We still need more finished articles for our May contest theme: Remake the Classics

### #ActualZilee

Posted 31 December 2012 - 08:06 PM

I generate a polygon inside a map. Every point corresponds to an integer value. My current filling algorithm works for most polygons, but as soon as I get convex polygons it has problems :

Both problems are pretty obvious when looking at the picture, sometimes it fills the exterior the only reason that this doesn't happen all the time is because I check to see if the next fill is even(It's always supposed to be even since fills are done by region, ie 0 then 2 then 4.)

The other problem is that since I draw pairs of points, since I treat consecutive rows of 1's as one point the next segment is ignored since there's only one point left.

Here's the filling code :

void PolygonGenerator::fillInside(std::vector< std::vector<int> > &vec, std::vector<CoordinateXY> &vertices)
{
for(unsigned int i = 0; i < vec.size(); i++)
{
std::vector<int> pointCoords = countOnALine(vec[i], i, coordinates);

if(pointCoords.size() <= 1) continue;

for(unsigned int j = 0; j < pointCoords.size(); j+=2)
{
int pt1 = pointCoords[j];
int pt2 = pointCoords[j+1];

while(pt1 <= pt2)
{
if(j % 2 == 0)
vec[i][pt1] = 1;
pt1++;
}

}
}
}

std::vector<int> PolygonGenerator::countOnALine(const std::vector<int> &vec, int lineIndex, std::vector<CoordinateXY> &vertices)
{
std::vector<int> pointCoords;
for(unsigned int i = 0; i < vec.size(); i++)
{
if( (i+1) >= vec.size()) continue;

if(vec[i] == 1 && vec[i+1] == 0)
pointCoords.push_back(i);
}

return pointCoords;
}

I hope the code is self-comprehensible. I don't use the vertices in the countOnALine method or the lineIndex. The method's purpose is simply to return non-consecutive coordinates of 1's.

I've spent too much time trying to figure this thing out, I'm done for today. I hope someone has a clue. I know of another method to fill polygon's, but it is pretty shitty.

### #1Zilee

Posted 31 December 2012 - 08:06 PM

I generate a polygon inside a map. Every point corresponds to an integer value. My current filling algorithm works for most polygons, but as soon as I get convex polygons it has problems :

Both problems are pretty obvious when looking at the picture, sometimes it fills the exterior the only reason that this doesn't happen all the time is because I check to see if the next fill is even(It's always supposed to be even since fills are done by region, ie 0 then 2 then 4.)

The other problem is that since I draw pairs of points, since I treat consecutive rows of 1's as one point the next segment is ignored since there's only one point left.

Here's the filling code :

void PolygonGenerator::fillInside(std::vector< std::vector<int> > &vec, std::vector<CoordinateXY> &vertices)
{
for(unsigned int i = 0; i < vec.size(); i++)
{
std::vector<int> pointCoords = countOnALine(vec[i], i, coordinates);

if(pointCoords.size() <= 1) continue;

for(unsigned int j = 0; j < pointCoords.size(); j+=2)
{
int pt1 = pointCoords[j];
int pt2 = pointCoords[j+1];

while(pt1 <= pt2)
{
if(j % 2 == 0)
vec[i][pt1] = 1;
pt1++;
}

}
}
}

std::vector<int> PolygonGenerator::countOnALine(const std::vector<int> &vec, int lineIndex, std::vector<CoordinateXY> &vertices)
{
std::vector<int> pointCoords;
for(unsigned int i = 0; i < vec.size(); i++)
{
if( (i+1) >= vec.size()) continue;

if(vec[i] == 1 && vec[i+1] == 0)
pointCoords.push_back(i);
}

return pointCoords;
}

I hope the code is self-comprehensible. I don't use the vertices in the countOnALine method or the lineIndex. The method's purpose is simply to return non-consecutive coordinates of 1's.

I've spent too much time trying to figure this thing out, I'm done for today. I hope someone has a clue.

PARTNERS