2011-02-01 2 views
1

Предположим, что случайные точки P1 to P20 разбросанные в самолете. Тогда есть ли способ отсортировать эти очки в по часам или anti-clock wise. enter image description hereСортировка точек в 2D-пространстве

Здесь мы не можем использовать степень, потому что вы можете видеть на изображении много точек могут иметь одинаковую степень. Например, здесь P4, P5 и P13 приобретают такую ​​же степень.

ответ

3

Вы хотите, чтобы вы заказали результат P1, P2, ... P13?

Если это так, вам нужно найти convex hull пунктов. Прогуливаясь по окружности корпуса, вы дадите вам порядок точек, которые вам нужны.

В практическом смысле взгляните на documentation OpenCV - вызов convexHull с помощью clockwise=true дает вам вектор очков в том порядке, в котором вы хотите. Ссылка предназначена для C++, но там есть API C и Python. Другие пакеты, такие как Matlab, должны иметь аналогичную функцию, так как это общая геометрическая проблема для решения.

EDIT

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

enter image description here

и нет:

enter image description here

В обеих диаграммах, зеленый оригинальная выпуклая оболочка, другие цвета - обвалы.

+0

Нет, у меня всего 20 точек, от P1 до P20 и его значений x и y, и это не означает, что от P1 до P20, которые разбросаны по плоскости, я хочу, чтобы эти точки были в порядке от P1 до P20 или от P20 до P1.Спасибо .......... – Pritesh

+0

Так почему же выпуклый корпус ** не **, что вы хотите? – misha

+0

Выпуклый корпус удаляет вогнутые точки. в моем случае (см. изображение) он удалит точки с P2 на P7, что нежелательно. – Pritesh

3

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

2

Найдите самые правые точки (в O(n)) и отсортируйте по углу относительно этой точки (O(nlog(n))).

Это первый шаг алгоритма выпуклого корпуса Graham, поэтому это очень распространенная процедура.

Редактировать: На самом деле это просто невозможно, так как многоугольное представление (т. Е. Выходной порядок) ваших точек неоднозначно. Алгоритм, указанный выше, будет работать только для выпуклых многоугольников, но он может быть расширен и для работы с звездообразными многоугольниками (вам нужно выбрать другую «опорную точку»).

Необходимо точно определить, какие пожелания вы хотите, точнее.

+1

Это не сработает, если изображение будет наклонено так, что P19 станет самой правой точкой: P2 - P8 не будет правильно упорядочен. –

+0

Самая правая точка - P1. Не будет ли P4 и P13 иметь аналогичный угол относительно P1? – misha

+0

@ Христианский, правильный - отредактировал мой ответ. Проблема возникла сразу после моего опубликования. – ltjax

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