Вычислительная геометрия
Лекция, 02 Октября 2011, автор: пользователь скрыл имя
Краткое описание
Векторы и операции над ними
Оглавление
Векторы
Прямые
Отрезки
Полигоны
Выпуклые оболочки
Файлы: 1 файл
Вычислительная геометрия.ppt
— 304.50 Кб (Скачать)(общий случай)
- Метод углов:
- если из точки провести векторы во все вершины полигона и найти сумму углов между соседними векторами (с учетом знака), то для внутренней точки сумма получится равной 2, а для внешней – 0.
- Метод лучей:
- Любой луч, проведенный из внутренней точки, будет иметь нечетное число пересечений с границами полигона, а из внешней – четное.
- Все дело портят особые случаи: луч проходит через вершину, луч совпадает со стороной. Приходится проверять положение соседних вершин – по одну сторону луча или по разные?
- Метод углов надежнее.
10
{Pi} – исходный набор из N точек;
W – стек точек.
Выбрать самую нижнюю-правую то
Отсортировать остальные точки
вместо угла удобнее проверять условие
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(Pi);
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) ? Возможно, при правильном выборе .
- Забудьте формулу Герона. Для очень узких треугольников она дает нулевую площадь. Пользуйтесь векторным произведением сторон.
- Рассматривайте все случаи взаимного расположения фигур.
- Два отрезка могут лежать, например, так:
- Два круга:
- Обращайте внимание на знак результата, он может иметь важный смысл (например, знак площади треугольника).