получить периметр 2D набора точек

У меня есть набор точек в 2D (координаты для x и y), теперь мне нужно отбросить все точки, которые не имеют для меня значения, и я имею в виду, что меня интересует только область, в которой эти точки отслеживают.

Короче говоря, это

введите здесь описание изображения

он должен производить это

введите здесь описание изображения

вопрос: какой алгоритм может выполнять такую ​​​​фильтрацию по этим точкам?


person pgf    schedule 31.03.2013    source источник


Ответы (2)


Вы можете использовать Graham_scan для вычисления выпуклой оболочки заданных точек. Когда у вас есть все точки на выпуклой оболочке, вы можете исключить остальные.

Существуют другие алгоритмы для вычисления выпуклых оболочек, но сканирование Грэма легко реализуемо и выполняется за O(n logn).

person vidit    schedule 31.03.2013
comment
просто обратите внимание, что /convex/ hull возвращает выпуклую оболочку: в вашем примере вы, вероятно, пропустите точку на дне, которая не является частью выпуклой оболочки (форма, которую вы получите, будет следовательно, выпуклая, и любая точка, которая сделала бы эту форму невыпуклой, не будет возвращена) - person nbonneel; 01.04.2013
comment
Чтобы продолжить комментарий WhitAngl, вы также можете изучить альфа-оболочки (также известные как альфа-формы), чтобы получить точки, которые близки к выпуклой оболочке, но не являются ее частью. cgm.cs.mcgill.ca/~godfried/teaching/ проекты97/белэр/ - person Rethunk; 07.04.2013

Я полагаю, что вы ищете алгоритм выпуклой оболочки. Я лично использую алгоритм Graham Scan для реализации выпуклой оболочки, поскольку он имеет очень хорошую сложность O(n*log(n)) и относительно прост. реализовать.

person Ivaylo Strandjev    schedule 31.03.2013
comment
наверное, вроде неплохой, но реального алгоритма я там не вижу. - person pgf; 31.03.2013
comment
@pgf извините за это. Добавлена ​​ссылка на хороший алгоритм для выпуклой оболочки. - person Ivaylo Strandjev; 31.03.2013