Итак, у меня есть карта, которая разделена на провинции, каждая провинция (очевидно) соседствует с парой других, каждая из которых имеет свою форму. Исходное изображение для этих фигур имеет низкое разрешение, поэтому я написал код для отслеживания каждой фигуры и ее сохранения. Теперь, это все хорошо и хорошо, но вся причина, по которой я хотел отследить это, была в том, чтобы я мог векторизовать его, чтобы указанные фигуры не выглядели неровными при увеличении. Вот как выглядят некоторые из них, когда края оставить как есть (я выделил одну из фигур):
Чтобы удалить видимые неровные края, я сначала попробовал это:
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;
}
Я беру среднее между текущей точкой и следующей и предыдущей соответственно, чтобы фигуры не перекрывались и не имели промежутков между ними. Проблема в том, что этот код дает следующие результаты:
Обратите внимание на отверстия, где встречаются разные формы.
Я попытался избежать их, изменив первые две строки оператора 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))
Который дал следующие результаты:
Улучшение, но все же не желаемый эффект.
Итак, наконец, мой вопрос: как я могу удалить зазубренные края таких фигур, чтобы между ними по-прежнему не было дыр?
Вот как выглядят координаты точки, не меняя их, используя первый метод, а затем второй: http://pastebin.com/AaNsw7F3
Задача ещё не решена.