Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
01.05.2014
Размер:
61.95 Кб
Скачать

Санкт-Петербургский Государственный Электротехнический Университет

Кафедра МОЭВМ

Отчет по курсовой работе

на тему:

«Алгоритм Грэхема»

Выполнил студент гр. 8341:

Сединкин Ю.А.

Проверил:

Ивановский С.А.

Санкт-Петербург

2003

Описание задачи.

Задано множество S , содержащее N точек на плоскости. Требуется построить их выпуклую оболочку (т.е. полное описание границы множества CH(S)).

Выпуклая оболочка (ВП) – это многоугольник, вершины которого следуют в определенном порядке. Поэтому мы можем говорить о задаче сортировки. Следовательно, для нахождения упорядоченной ВП N точек на плоскости требуется время (N log N) . Эта задача сводится к проверке крайности точек множества. Операция имеет вид: даны три точки р(x,y), р1(x1,y1), р2(x2,y2), определяем нахождение точки р от ориентированного отрезка p1p2. Полином, реализующий эту проверку, задается определителем,

x y 1

 = x1 y1 1

x2 y2 1

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

Анализ задачи.

Самым грубым решением нахождения выпуклой оболочки требуется:

- определить крайние точки;

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

Точка не является крайней множества S, если она лежит в некотором треугольнике , вершинами которого являются точки из S, но она сама не является вершиной. Имеется О(N3) треугольников, проверка принадлежности точки заданному треугольнику может быть выполнена за некоторое постоянное число операций, за время О(N3 ) можно определить, является ли точка крайней. Повторение этой процедуры для всех точек множества даст время О(N3 ) . В работе представлено решение, которое уменьшает это время до O(NlogN). Это время является нижней оценкой построения оболочки, отсюда следует можно говорить об оптимальности алгоритма Грэхема.

Точка p не является крайней, так как она находится внутри треугольника (p1p2p3).

Описание метода и алгоритма.

За время О(N ) находим центроид q множества из N точек. Точки сортируются (упорядочиваются) в соответствии со значением полярного угла, используя точку q в качестве начала системы координат.

Сравнение полярных углов путем вычисления ориентированной площади треугольника (0,p2,p1).

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

Начало обхода точек в методе Грэхема. Вершина p2 удаляется, если угол p1p2p3 оказывается вогнутым.

Просмотр начинается с точки, помеченной как НАЧАЛО. Тройки последовательных точек многократно проверяются в порядке обхода против часовой стрелки с целью определить, образуют или нет они угол, больший или равный . Если внутренний угол p1p2p3 больше или равен , то говорят, что p1p2p3 образуют "правый поворот", иначе они образуют "левый поворот". Из выпуклости многоугольника непосредственно следует, что при его обходе будут делаться только левые повороты. Если p1p2p3 образуют правый поворот , то p2 не может быть крайней точкой, так как она является внутренней для треугольника (0p1p3). В зависимости от результата проверки угла, образуемого текущей тройкой точек, возможны два варианта продолжения просмотра:

1. p1p2p3 образуют правый поворот. Удалить вершину p2 и проверить тройку p0p1p3.

2. p1p2p3 образуют левый поворот. Продолжить просмотр, перейдя к проверке тройки p2p3p4.

Просмотр завершается, когда, обойдя все вершины, вновь приходим в вершину НАЧАЛО. Заметим, что вершина НАЧАЛО никогда не удаляется, так как она является крайней точкой и поэтому при отходе назад после удаления точек , мы не сможем уйти дальше точки, предшествующей точке НАЧАЛО.

Метод обхода Грэхема.. Суть алгоритма Грэхема состоит в однократном просмотре упорядоченной последовательности точек, в процессе которого удаляются внутренние точки. Оставшиеся точки являются вершинами выпуклой оболочки, представленными в требуемом порядке.

procedure ОБОЛОЧКА-ГРЭХЕМА(S)

1.Найти внутреннюю точку или точку с минимальной ординатой q.

2. Используя q как начало координат, упорядочить точки множества S в соответствии с полярным углом и расстоянием от q . Точки организовать в виде кольцевого двусвязного списка со ссылками СЛЕД и ПРЕД и указателем НАЧАЛО на первую вершину. Значение true логической переменной f указывает на то, что начальная вершина оказалась достигнута при прямом продвижении по оболочке, а не в результате возврата.

3. Обход:

begin v := начало ; w:=пред(v); f:= false;

while (след(v)<>начало or f= false) do

begin if след(v) = w then:= f true;

if( v, след(v), след(след(v) образуют левый поворот) then v:= след(v)

else begin удалить след(v ) ; v:=пред( v )

end;

end;

end;

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

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

Алгоритм Грэхема имеет оптимальное время выполнения.

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

Исключительные ситуации.

Метод Эндрью – это частный случай метода Грэхема при сортировке от бесконечно удаленной в отрицательном направлении по оси y точки. В таком случае упорядоченность по абсциссе совпадает с упорядоченностью по полярному углу. Метод Эндрью позволяет избавиться от подсчета векторных произведений углов (и от проблем, с этим связанных), т.к. точки сортируются по абсциссе и разделяются на два подмножества (сверху и снизу от прямой, соединяющей крайнюю левую и крайнюю правую точки), к которым применяется обход Грэхема. Соединение двух ломаных, представляющих оболочки Грэхема для верхнего подмножества точек и нижнего, дает выпуклую оболочку исходного множества.

Левая и правая крайние точки определяют разбиение множества на два подмножества.

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

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

Пользовательский интерфейс.

Множество точек для построения оболочки можно получить тремя способами:

  • при помощи мыши нарисовать точки в рабочей области окна;

  • с помощью кнопки «Загрузить» прочитать необходимый файл;

  • с помощью правой кнопки мыши выделить место в рабочей области и ввести количество случайных точек в ней;

Для сохранения текущей комбинации точек в меню выбирается «Сохранить»

Для сохранения текущей картинки в формате *.в меню выбирается «Сохранить Скриншот».

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

Для более наглядной демонстрации работы алгоритма имеется возможность обработки по шагам.

Для очистки старых результатов нужно закрыть открытое окно.

Для получения новых – открыть (создать) новое.

Для переключения между способами обработки (Алгоритм Грэхема – Модификация Эндрью) можно выбрать соответствующий метод в меню «Алгоритм», по умолчанию – «Метод Грэхема».

Доработки и исправления:

  • Исправлены ошибки при работе с MDI

    • корректное формирование списка окон

    • корректное отображение выбранного алгоритма

  • Исправлены ошибки при работе алгоритма

    • корректное отображение действий алгоритма «Модификация Эндрю»

    • исправлена ошибка при формировании выпуклой оболочки, если точки находятся на горизонтальной прямой

  • Исправлены ошибки при генерации случайной последовательности точек

    • генерация идёт только в выбранной области

    • при выборе области «наоборот» не происходит сбоя функционирования алгоритмов

Недостатки программы:

  • Не удалось реализовать корректную работу с преобразованием координат, при масштабировании

Соседние файлы в папке Doc