2011-08-11 2 views
6

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

Это провал на вогнутых частях

Благодаря

Вот картина: enter image description here

зеленый круг в центре.

Он должен выглядеть следующим образом: enter image description here

+2

Учитывая, что многоугольник просто определяется его точками и является невыпуклым, я не уверен, что есть решение без каких-либо дополнительных ограничений. Непонятно, что многоугольник однозначно определен. – Keith

ответ

11

Понятие «сортировка по часовой стрелке» не определено, если у вас нет предварительно заданной центральной точки.

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

Кроме того, поиск центра, который позволит вам повторно создать исходный многоугольник с помощью сортировки по CW (или CCW), возможен только для специального класса полигонов: так называемых star-shaped полигонов. Основное свойство звездообразного многоугольника состоит в том, что можно найти точку внутри многоугольника, из которой «внутреннее» многоугольник является «наблюдаемым» (я надеюсь, что без определения ясно, что означает «наблюдаемое»).

Если ваш многоугольник не имеет звездной формы, то такой центр не существует. И по этой причине невозможно повторно создать исходный многоугольник с помощью сортировки по CW.

Ваш контур коровы на картинке, очевидно, не является звездообразным многоугольником, а это значит, что вы никогда не сможете воссоздать оригинальный контур коровы, отсортировав точки вокруг какого-либо центра, любого центра. Нет «правильного пути». Это невозможно.

+0

Тогда какие алгоритмы доставили мне оригинальную корову? – jmasterx

+1

@Milo: Представьте себе более простой полигон, такой как пятиконечная звезда. Если вы стираете линии и просто смотрите на точки, есть как минимум две возможные реконструкции: звезда или два концентрических пятиугольника с одной недостающей стороной, каждая из которых соединена двумя линиями. Стирание линий выдает ценную информацию, и проблема не может быть надежно решена. (По совпадению, как говорит Андрей, звезды, похоже, поддаются алгоритму, который вы уже пробовали, но коровы не являются звездами.) – Potatoswatter

+2

@Milo: Если точки на контуре упакованы очень плотно (особенно в изогнутых частях), то вы может воссоздать корову, просто перепрыгивая с одной точки на следующую ближайшую точку. Однако, если точки недостаточно плотные, то в некоторых местах вы можете столкнуться с ошибками. В общем случае просто невозможно воссоздать исходный контур из неупорядоченного множества точек. Как я сказал выше, существует множество различных контуров, которые могут быть построены из множества точек. Поскольку у вас нет способа решить, какой из них правильный, вы не можете его воссоздать. – AnT

1

Принимая любой как центр, вы должны быть в состоянии определить расстояние и угол для всех точек в наборе, а сортировка по углу проста после этого. Тем не менее, точка, которую вы выбираете как центр, будет влиять на порядок сортировки, поэтому трудно понять, что должен делать «правильный» порядок, пока вы не выберете точку в качестве центра.

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

+0

Посмотрите мои фотографии, чтобы узнать больше о проблеме. – jmasterx

+0

Ваша сортировка верна. Проблема в том, что вы не можете произвести коровы, сортируя по углу. – Caleb

+0

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

2

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

Это не простая задача, но здесь эвристический, которые должны хорошо работать:

  1. Для каждой точки, найти следующую ближайшую точку. Это определяет набор потенциальных связей.
  2. Добавить наибольшее возможное соединение с многоугольником.
  3. Повторите 1-2, но проигнорируйте уже созданные соединения и точки, которые уже имеют два соединения.

Это только эвристика, а не решение. Я не уверен, что даже гарантированно создаст многоугольник.

Смежные вопросы