В настоящее время я пытаюсь получить обрезанные ячейки из многоугольника-Вороного-пересечения.
Вот что у меня есть до сих пор:
У меня есть многоугольник, и я вычислил в нем несколько точек для расчета диаграммы Вороного, а красные линии на рисунке ниже — это ребра Вороного. Затем я использовал алгоритм для получения угловых точек из каждой ячейки, и теперь мне нужно получить углы в правильном направлении (по часовой стрелке), чтобы создать многоугольник ячейки.
Найдены углы для одной ячейки
Сначала я использовал этот метод:
private List<Vector> sortClockwise(List<Vector> points)
{
points = points.OrderBy(x => Math.Atan2(x.X, x.Y)).ToList();
return points;
}
но в некоторых специальных вогнутых многоугольниках это не работает, и правильный порядок смешивается.
Есть ли у кого-нибудь предложение или намек, как это можно сделать самым простым способом? Учтите, что точки многоугольника уже расположены в правильном порядке, а углы вороного перепутаны и их нужно отсортировать по точкам многоугольника.
Моя идея:
- Найти первую точку многоугольника в углах ячеек
- идите вдоль направления многоугольника и смотрите, находится ли точка вершины вороного на этой линии.
- если да: получить конечную точку найденного ребра Вороного и найти общие ребра Вороного.
- если найдены общие ребра, всегда брать самое правильное
- делай, пока не достигнешь кулака
Это единственный способ сделать это?
ИЗМЕНИТЬ – ОБНОВИТЬ
Хорошо, у меня есть какой-то половинчатый ответ.
Как я уже сказал, у меня есть все вершины, которые принадлежат одной из ячеек Вороного, но порядок все еще перепутан, поэтому я подумал, что могу отсортировать их по углу от центроида следующим образом:
private List<Vector> sortClockwiseBySentroid(List<Vector> points, Vector center)
{
points = points.OrderBy(x => Math.Atan2(x.X - center.X, x.Y - center.Y)).ToList();
return points;
}
Но это не всегда работает. Вот примеры, когда это работает, а когда нет. Проблема в том, что на вогнутых гранях угол от центроида до угла иногда меньше, чем тот, который мне действительно нужен. Любое предложение о том, как это исправить?
Вот это работает
Здесь не работает...