swap ( s [a], s [i]);
p -> addVertex ( s [I], p -> numVertices ); a = i + 1;
for (int j = i + 2; j <= n; j++ ) {

int с = s [j].classify ( s [i], s [a]);

if ( с == LEFT || с == BEYOND) a = i;

}
if ( a == n ) return p;
}
return NULL;

Компьютерная графика. Полигональные модели Временные затраты данного алгоритма равны 0(1т), где Л - число вершин в границе искомой выпуклой оболочки. Работа данного алгоритма проиллюстрирована на рис. 8.7

Рассмотрим еще один алгоритм для построения выпуклой оболочки, так называемый метод обхода Грэхема. В этом методе выпуклая оболочка конечного набора точек S находится в два этапа. На первом этапе алгоритм выбирает некоторую экстремальную точку а е S и сортирует все остальные точки в соответствии с углом направленного к ним из точки а луча. На втором этапе алгоритм выполняет пошаговую обработку отсортированных точек, формируя последовательность многоугольников, которые в конце концов и образуют искомую выпуклую оболочку convS.

Рис. 8.7

Рассмотрим еще один алгоритм для построения выпуклой оболочки, так называемый метод обхода Грэхема. В этом методе выпуклая оболочка конечного набора точек S находится в два этапа. На первом этапе алгоритм выбирает некоторую экстремальную точку а е S и сортирует все остальные точки в соответствии с углом направленного к ним из точки а луча. На втором этапе алгоритм выполняет пошаговую обработку отсортированных точек, формируя последовательность многоугольников, которые в конце концов и образуют искомую выпуклую оболочку convS.

Выберем в качестве экстремальной точки точку с минимальной у-координатой и поменяем ее местами с s0. Остальные точки сортируются затем в порядке возрастания полярного угла относительно точки sq. Если две точки имеют одинаковый полярный угол, то точка, расположенная ближе к % должна стоять в отсортированном списке раньше, чем более дальняя точка. Это сравнение реализуется рассмотренной ранее функцией polarCmp.

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

// File graham.срр #include <stdlib.h> #include "polygon.h" #include "stack.h"

template <class T> void swap ( T a, T b )

о

JJL
{
Tc;

с = a; a = b; b = a;

8. Основные алгоритмы вычислительной геометрии

Polygon * grahamScan ( Vector2D s [], int n ) {
// step 1 for (int i = 1, m = 0; i < n; i++ ) if(s[i]<s[m]) m = i;
swap ( s [m], s [0]);

⇐ Предыдущая| |Следующая ⇒