Вычисление области полигона

Итак, для работы я работаю над контроллером робота, который исследует произвольную область. Область определяется серией вершин (это многоугольник). Вот пример:

Пример региона.

Робот начинает с середины и пытается достичь самой внешней границы, а затем следовать за ней по всему периметру. Однако из-за характера местности он может быть не в состоянии добраться до определенных областей и может исследовать только данный регион:

Полное исследование заблокировано.

Что я хочу сделать, так это вычислить все отдельные регионы, которые не были исследованы, и вернуть вершины, определяющие их границы, например:

Рассчитанные регионы

После того, как это вычислено, у меня должен быть новый массив полигонов, содержащий геометрию для A, B и C.

К сожалению, я не могу придумать хороший и быстрый алгоритм для этого. Каков наилучший способ вычислить это?


person CodeBunny    schedule 25.06.2012    source источник


Ответы (2)


Один из методов состоит в том, чтобы определить предикат для точки p, чтобы она «касалась» границы окружающей области, возможно, в соответствии с некоторым допуском > 0, например, T тогда и только тогда, когда p< /em> находится на расстоянии от границы. Затем пройдите границу исследуемой области, отмечая этот предикат для каждой вершины: ..,T, T, T, F, F, F, F, F, T, T,... Затем ваши области ограничиваются максимальными строками Fs, двумя T ветками, ограничивающими эти Fs, и границей ограничивающей области между ними. Строка, которую я только что использовал в качестве примера, описывает ваш регион B: пять F.

person Joseph O'Rourke    schedule 25.06.2012

ISTM, что вам нужна логическая разница внешнего ограничивающего многоугольника за вычетом внутреннего розового (исследованного) многоугольника. Однако для этого не существует простого алгоритма, поэтому я предлагаю вам просмотреть и выбрать из различных библиотек обрезки полигонов.

Вот довольно недавнее сравнение ряда библиотек отсечения — http://rogue-modron.blogspot.com.au/2011/04/polygon-clipping-wrapper-benchmark.html

А также беззастенчивый плагин для моего собственного бесплатного полигонального клипера с открытым исходным кодом - http://angusj.com/delphi/clipper.php

person Angus Johnson    schedule 25.06.2012
comment
Это аналогичная проблема с отсечением полигонов, но я хочу, чтобы возвращалась серия полигонов, а не один. Я также хочу иметь допуск - если точки исследуемой области находятся близко к внешней границе, считается, что я ее достиг. - person CodeBunny; 26.06.2012
comment
Любой приличный клипер вернет несколько полигонов. Как и в вашем примере, решение было бы неверным, если бы возвращался только один полигон. Что касается «допуска», возможно, вы могли бы сместить (раздуть/сдуть) либо внутренний многоугольник, либо внешний ограничивающий многоугольник на этот допуск. - person Angus Johnson; 27.06.2012