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

C++ 如何正确删除相邻形状的锯齿边,c++,geometry,polygons,C++,Geometry,Polygons,我有这张地图,分为几个省,每个省(很明显)相邻,每个省有不同的形状。这些形状的源图像分辨率很低,因此我编写了一些代码来跟踪并存储每个形状。现在,这一切都很好,但我想要跟踪它的全部原因是,我可以对它进行矢量化,这样当你放大时,所说的形状就不会看起来参差不齐了。下面是其中一些边保持原样时的外观(我突出显示了其中一个形状): 为了去除上述锯齿状边缘,我首先尝试了以下方法: std::vector<sf::Vector2f> removeRightAngles(const std::vec

我有这张地图,分为几个省,每个省(很明显)相邻,每个省有不同的形状。这些形状的源图像分辨率很低,因此我编写了一些代码来跟踪并存储每个形状。现在,这一切都很好,但我想要跟踪它的全部原因是,我可以对它进行矢量化,这样当你放大时,所说的形状就不会看起来参差不齐了。下面是其中一些边保持原样时的外观(我突出显示了其中一个形状):

为了去除上述锯齿状边缘,我首先尝试了以下方法:

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;
}
std::向量和角度(const std::向量和点)
{
std::向量返回值;
对于(std::vector::const_迭代器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(三点碱(A,B,C)))
{
返回值。推回(B);
}
其他的
{
常数sf::向量2f 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);
如果(!element includeInvector(candidateA,returnValue))returnValue.push_back(candidateA);
如果(!element includeInvector(candidateB,returnValue))returnValue.push_back(candidateB);
}
}
返回值;
}
我分别取当前点与下一个点和上一个点之间的平均值,这样形状就不会重叠,也不会在它们之间留有空间。问题在于此代码会产生以下结果: 注意不同形状相交的孔。 我试图通过将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))
const sf::Vector2f A=it!=点。开始()*(it-1):points.at(points.size()-1),B=*it,C=it+1!=结束*(it+1):*点。开始(),
D=it+3>=points.end()*(it+3-points.size()):*(it+3),E=it-3
这产生了以下结果:

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


以下是使用第一种方法和第二种方法,在不改变点坐标的情况下点坐标的外观:

您是否介意在上面转储一些测试数据(或类似的东西)。希望这就是您所说的测试数据:您是否介意在上面转储一些测试数据(或类似的东西)。希望这就是您所说的测试数据: