У меня есть матрица (0 ничего не значит, 1 означает местность), которая представляет собой уровень в моей игре. Матрица соответствует сетке, в которой мой экран разбит, и указывает, где идет моя местность.
Мой ландшафт фактически состоит из 4 точек в углах каждого блока в сетке. Когда у вас есть несколько блоков, которые связаны, я использую алгоритм слияния, который удаляет дубликаты точек и любые внутренние точки. В результате я получаю список точек, представляющих только внешние ребра многоугольника.
Чтобы нарисовать этот многоугольник, мне нужно, чтобы точки находились в некотором порядке (по часовой или против часовой стрелки), так что за каждой точкой следует соседняя точка. Очевидно, что первый и последний пункты должны быть соседями. Поскольку это все в сетке, я знаю точное расстояние между соседними точками.
Проблема заключается в том, что у меня возникают проблемы с алгоритмом, который позволяет мне "ходить" по краю многоугольника, вставляя точки в порядок. Я считаю, что должен быть способ использовать тот факт, что у меня есть матрица, представляющая геометрию, то есть есть только один возможный способ рисования многоугольника (даже если он вогнутый).
Я пробовал несколько подходов, используя алгоритмы жадного типа, но не могу найти способ узнать, во всяком случае, в каком направлении я хочу путешествовать. Учитывая, что в любой конкретной точке может быть до трех соседей ( четвертый не включен, потому что это "начальная" точка, а это значит, что я уже ее отсортировал). Мне нужен способ узнать, какой путь двигаться.
Update
Другой подход, который я пытался, - это отсортировать точки по их X (с тай-брейкером Y), который дает мне самый верхний/левый край. Это также гарантирует, что я начинаю с внешнего края. Тем не менее, я все еще изо всех сил пытаюсь найти алгоритм, который гарантирует, что я остаюсь снаружи, не пересекаясь.
Вот пример матрицы:
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 1 0 0
Что соответствует этому (черные точки представляют мои точки):