如何正确删除相邻形状的锯齿状边缘

时间:2015-08-07 00:59:34

标签: c++ geometry polygons

所以我将这张地图划分为省份,每个省(显然)与其他几个省相邻,每个省都有不同的形状。这些形状的源图像分辨率很低,所以我写了一些代码来跟踪每个形状并存储它。现在,这一切都很好,但是我想跟踪它的全部原因是我可以对它进行矢量化,这样当你放大时所说的形状看起来不会看起来像是锯齿状的。这是边缘是什么时它们的样子保持原样(我突出了其中一个形状): no edge removal

为了消除上面看到的锯齿状边缘,我首先尝试了这个:

std::vector<sf::Vector2f> removeRightAngles(const std::vector<sf::Vector2f>& points)
{
    std::vector<sf::Vector2f> returnValue;
    for (std::vector<sf::Vector2f>::const_iterator it = points.begin(), end = points.end(); it != end; ++it)
    {
        const sf::Vector2f A = it != points.begin() ? *(it - 1) : points.at(points.size() - 1), B = *it, C = it + 1 != end ? *(it + 1) : *points.begin());
        if (threePointsMakeALine(A, B, C)))
        {
            returnValue.push_back(B);
        }
        else
        {
            const sf::Vector2f candidateA((A.x + B.x) / 2.0f, (A.y + B.y) / 2.0f),
                candidateB((B.x + C.x) / 2.0f, (B.y + C.y) / 2.0f);
            if (!elementIncludedInVector(candidateA, returnValue)) returnValue.push_back(candidateA);
            if (!elementIncludedInVector(candidateB, returnValue)) returnValue.push_back(candidateB);
        }
    }
    return returnValue;
}

我分别取当前点与下一个和前一个点之间的平均值,以便形状不重叠或之后有空格。问题是此代码产生以下结果: edge removal 注意不同形状相遇的孔。 我尝试通过修改for语句的前两行来避免它们:

const sf::Vector2f A = it != points.begin() ? *(it - 1) : points.at(points.size() - 1), B = *it, C = it + 1 != end ? *(it + 1) : *points.begin(),
    D = it + 3 >= points.end() ? *(it + 3 - points.size()) : *(it + 3), E = it - 3 < points.begin() ? *(it - 3 + points.size()) : *(it - 3);
if (threePointsMakeALine(A, B, C) || threePointsMakeALine(B, C, D) || threePointsMakeALine(E, A, B))

产生了以下结果:

improved edge removal

improved edge removal

improved edge removal

改善,但仍未达到预期的效果。 所以,最后,我的问题是,如何去除这些形状的锯齿状边缘,使它们之间没有孔?

以下是点坐标的外观,而不更改它们,使用第一种方法,然后使用第二种方法:http://pastebin.com/AaNsw7F3

0 个答案:

没有答案