найти многоугольник из логической сетки

У меня есть двумерный массив bool, подобный этому

2-мерный массив логических значений

В фигуре не будет никаких отверстий — даже если они есть — я их проигнорирую. Теперь я хочу найти многоугольник, охватывающий мою фигуру:

охватывающий многоугольник

Есть ли готовый алгоритм для этого случая? Мне ничего не удалось найти, но я не уверен, знаю ли я правильный поисковый запрос для этой задачи.


person user2033412    schedule 16.09.2013    source источник
comment
Мне кажется, что вы нашли многоугольник. Но, возможно, вы могли бы объяснить немного больше о том, что у вас есть и чего вы хотите. Как представлен ваш массив? Какое представление вы хотите для многоугольника, который вы пытаетесь найти?   -  person High Performance Mark    schedule 16.09.2013
comment
Я нашел многоугольник вручную, но я хочу, чтобы моя программа нашла его. Я хотел бы найти список координат xy, представляющих многоугольник.   -  person user2033412    schedule 16.09.2013
comment
Поскольку у вас есть координаты включенных квадратов, ответ на этот вопрос - заголовок ="сортировать против часовой стрелки точки прямолинейного многоугольника%23comment26081406_17862162">stackoverflow.com/questions/17862162/ - вы получите остальную часть пути.   -  person High Performance Mark    schedule 17.09.2013


Ответы (2)


Вы можете использовать триангуляцию Делоне, а затем удалить самые длинные ребра. Я использую среднее значение всех ребер, умноженное на константу.

person Gigamegs    schedule 16.09.2013
comment
Делоне-триангуляция - это O (n * log (n)), что я считаю слишком дорогим для моей задачи. Бьюсь об заклад, есть O(n)-способ сделать это. - person user2033412; 16.09.2013

Немного подумав, я обнаружил это, и есть O (n)-способ сделать это: поиск по строке для первой координаты, которая содержит хотя бы одно соседнее поле, установленное как true. Оттуда вы определенно можете сделать первый шаг вправо. Отныне просто ходите по полю, решая, в каком направлении идти дальше, исходя из четырех соседних полей.

person user2033412    schedule 18.09.2013