У меня есть карта 2D-высоты в следующем формате
06 36 39 42 43 55 ...
37 40 43 43 45 46 ...
40 43 44 45 46 48 ...
44 44 46 47 48 50 ...
41 44 45 47 48 48 ...
...
И мне нужно перенаправить его в формат контура, основанный на усмешке (так что он может быть затем отображен в спрайты)
. . . . | . .
. . . . \ . .
. . . / / . .
. . . | . . .
. . . | . . .
. / - / . . .
Здесь .
означает плоскую область, |
и -
прямые скалы, /
и \
углы скалы (каждая из которых представляет две разные возможности).
Я пробовал стандартный подход маршевых квадратов, но обнаружил, что выборка только 3 соседей приводит к довольно большому количеству проблем из-за перегрузки смежных случаев. (Обратите внимание на дополнительные неулокальные прямые скалы ниже)
. . . . | . \
. . . . \ \ .
. . . / / - .
. . . | - . .
. . . | . . .
. / - / . . .
Что бы я хотел, это некоторые ссылки на алгоритмы/подходы, которые помогают справиться с такими вещами. Я знаю, что контурная ходьба с каким-то глубинным поиском - это вариант, но еще не опробовал его, и предпочел бы оставить это в качестве крайней меры. Также есть вопросы о представлении некоторых функций, например, следует ли включать в себя клиновые выступы толщиной 1 элемент или просто игнорировать их. Другой вариант - пройти через сгенерированные контуры и изменить их, чтобы они плавно соответствовали друг другу, но это кажется действительно взломанным...