Вычислительная геометрия

Автор: Пользователь скрыл имя, 02 Октября 2011 в 22:47, лекция

Краткое описание

Векторы и операции над ними

Оглавление

Векторы
Прямые
Отрезки
Полигоны
Выпуклые оболочки

Файлы: 1 файл

Вычислительная геометрия.ppt

— 304.50 Кб (Скачать)
n="center">Принадлежность точки полигону 
(общий случай) 

  • Метод  углов:
    • если из точки провести векторы во все вершины полигона и найти сумму углов между соседними векторами (с учетом знака), то для внутренней точки сумма получится равной 2, а для внешней – 0.
  • Метод лучей:
    • Любой луч, проведенный из внутренней точки, будет иметь нечетное число пересечений с границами полигона, а из внешней – четное.
    • Все дело портят особые случаи: луч проходит через вершину, луч совпадает со стороной. Приходится проверять положение соседних вершин – по одну сторону луча или по разные?
  • Метод углов надежнее.

10  

{Pi} – исходный набор из N точек;

W  – стек точек.

Выбрать самую нижнюю-правую точку P0.

Отсортировать остальные точки по 
возрастанию угла (на самом деле, 
вместо угла удобнее проверять условие 
Left(Pi, P0, Pj).  
Если несколько точек с одинаковыми 
углами, оставить только самую дальнюю.

Push(P0);

Push(P1); 
i := 2;

while  i < N do begin 
  PT1 :=
точка в верхушке стека
PT2 :=
вторая сверху точка в стеке; 
  if Left(P[i], PT2, PT1) then begin  
    Push(P[i]); 
    i := i + 1; 
  end 
  else

     Pop(PT1); {Выбрасываем точку} 
end; 
{
В стеке остались точки выпуклой

   оболочки} 

Выпуклая оболочка множества точек
метод Грэхема 

T(n) = O(n·log(n)) 

P4 

P3 

P2 

P1 

P0 

P5 

P6 

P7 

P?

11  

{Pi} – исходный набор из N точек;

W  – стек точек.

Отсортировать все точки по 
возрастанию x, а при равенстве x по 
возрастанию y.  
{
Для простоты рассмотрим только точки  
сверху (Left(Pi, P0, Pn-1) = True)}

Push(P0);

Push(P1); 
i := 2;

while  i < N do begin 
  PT1 :=
точка в верхушке стека
PT2 :=
вторая сверху точка в стеке; 
  if Right(Pi, PT2, PT1) then begin  
    Push(P
i); 
    i := i + 1; 
  end 
  else

     Pop(PT1); {Выбрасываем точку} 
end; 
{
В стеке точки верхней половины 
выпуклой оболочки; нижняя половина 
находится аналогично, затем они  
сливаются} 

Выпуклая оболочка множества точек
метод Эндрю 

T(n) = O(n·log(n)) 

P2 

P5 

P8 

P10 

P6 

P4 

P1 

P0 

P3 

P7 

P9

12  

Мелкие советы 

  • Не  верьте в равенство вещественных  чисел.
    • cos2(x) + sin2(x) = 1.0 ? Очень сомнительно...
    • abs(cos2(x) + sin2(x) – 1.0) Возможно, при правильном выборе .
  • Забудьте формулу Герона. Для очень узких треугольников она дает нулевую площадь. Пользуйтесь векторным произведением сторон.
  • Рассматривайте все случаи взаимного расположения фигур.
    • Два отрезка могут лежать, например, так:
 
 
    • Два круга:
 
 
 
 
 
  • Обращайте внимание  на знак результата, он может иметь важный смысл (например, знак площади треугольника).

Информация о работе Вычислительная геометрия