
Вычислительная геометрия.ppt
- Количество слайдов: 12
Вычислительная геометрия План лекции: Векторы n Прямые n Отрезки n Полигоны n Выпуклые оболочки n автор: С. Н. Дроздов
Векторы и операции над ними n 2 Скалярное произведение: r·q = r. x·q. x + r. y·q. y ; Длина вектора: |r| = Sqrt(r·r); Вид угла между векторами: n n Векторы: r = (r. x, r. y); r. x = x 1 – x 0, r. y = y 1 – y 0; q = (q. x, q. y); q. x = x 2 – x 0, q. y = y 2 – y 0; n r·q > 0 – острый; r·q = 0 – прямой; r·q < 0 – тупой. Векторное произведение: r q = (xryq – xqyr)z; (z – единичный вектор оси Z). Площадь треугольника со сторонами r и q: S = ½ |r q|. Знак векторного произведения указывает направление поворота от r к q. Угол между векторами: sin( ) = |r q| / (|r|·|q|) – со знаком! cos( ) = |r·q| / (|r|·|q|)
Прямые n n Прямая определяется двумя точками: P = (x 1, y 1), Q = (x 2, y 2). Уравнение прямой: dx·(y – y 1) = dy·(x – x 1), где dx = x 2 – x 1, dy = y 2 – y 1 или Ax + By – C = 0 где A = dy, B = – dx, C = dy·x 1 – dx·y 1 dy Удобно использовать нормальный вектор n – вектор единичной длины, перпендикулярный к прямой. n = (–dy / dxy, dx / dxy) где dxy = sqrt(dx 2 + dy 2) Тогда уравнение прямой: R·n=w где R = (x, y) – радиус-вектор текущей точки, w = (x 2·y 1 – x 1·y 2). 3 P (x 1, y 1) n dxy Q (x 2, y 2) dx dxy = sqrt(dx 2 + dy 2)
Прямые (продолжение) n n n Еще одна удобная форма – параметрическое задание прямой: x = x 1 + dx·t y = y 1 + dy·t Расстояние от точки до прямой: d = |R · n – w| или d = |dx·(y 0 – y 1) - dy·(x 0 – x 1)| Положение точки относительно прямой: если задано направление прямой от P к Q, то можно ввести предикат, означающий, что точка R лежит слева от прямой: Left(R, P, Q) = (R · n > w) или dx·(y 0 – y 1) - dy·(x 0 – x 1) > 0 Аналогично Right(R, P, Q) = (R · n < w) или dx·(y 0 – y 1) - dy·(x 0 – x 1) < 0 P (x 1, y 1) 4 n R (x 0, y 0) dy Left d d Right Q (x 2, y 2) dx
Взаимное расположение прямых n A 1 x + B 1 y – C 1 = 0 A 2 x + B 2 y – C 2 = 0 Две прямые на плоскости могут: n пересекаться; q быть параллельны; q совпадать. Условие пересечения: n P (x 1, y 1) 5 n R (x 0, y 0) q dy A 1 B 2 – A 2 B 1 0 n n Координаты пересечения равны: x = (A 1 C 2 – C 1 A 2) / (A 1 B 2 – A 2 B 1) y = (C 1 B 2 – B 1 C 2) / (A 1 B 2 – A 2 B 1) Уравнение перпендикуляра к прямой A 1 x + B 1 x – C 1 = 0 из точки R (x 0, y 0): B 1 x – A 1 y + (A 1 y 0 – B 1 x 0) = 0 Q (x 2, y 2) dx
Отрезки n n n Отрезок определяется уравнением прямой и условием: min(x 1, x 2) x max(x 1, x 2) а для вертикальной прямой min(y 1, y 2) y max(y 1, y 2) В параметрической форме проще: 0 t 1 n Для определения расстояния от точки до отрезка надо опустить перпендикуляр из этой точки на прямую и проверить, попадает ли проекция точки на отрезок. Соответственно, расстояние до отрезка равно либо расстоянию до прямой, либо расстоянию до ближайшего конца отрезка. 6 R 2 P (x 1, y 1) dy R 1 dxy Q (x 2, y 2) dx dxy = sqrt(dx 2 + dy 2)
Полигоны (многоугольники) n Площадь полигона: q q n q 1 выбрать произвольную точку (например, начало координат) и провести из нее векторы во все вершины; суммировать площади всех n треугольников, образованных двумя векторами и стороной, с учетом знака векторного произведения. Это правильно работает и в случае невыпуклого полигона. В примере: знаки площади двух заштрихованных треугольников противоположные. Проверка выпуклости полигона: q q 2 7 q 3 q при обходе границы полигона знак векторного произведения соседних сторон должен быть одним и тем же. В примере: знаки q 1 q 2 противоположные.
Полигоны (продолжение) n 8 Направление обхода границы: сумма углов поворота при обходе границы может быть равна: 2 - внутренняя область полигона слева от контура обхода; - 2 - внутренняя область полигона справа от контура обхода. n Принадлежность точки выпуклому полигону: q при обходе границы полигона точка должна быть либо всегда слева, либо всегда справа.
Принадлежность точки полигону (общий случай) n Метод углов: q n если из точки провести векторы во все вершины полигона и найти сумму углов между соседними векторами (с учетом знака), то для внутренней точки сумма получится равной 2 , а для внешней – 0. Метод лучей: q q n 9 Любой луч, проведенный из внутренней точки, будет иметь нечетное число пересечений с границами полигона, а из внешней – четное. Все дело портят особые случаи: луч проходит через вершину, луч совпадает со стороной. Приходится проверять положение соседних вершин – по одну сторону луча или по разные? Метод углов надежнее.
Выпуклая оболочка множества точек: метод Грэхема 10 {Pi} – исходный набор из N точек; W – стек точек. Выбрать самую нижнюю-правую точку P 0. Отсортировать остальные точки по возрастанию угла (на самом деле, вместо угла удобнее проверять условие Left(Pi, P 0, Pj). Если несколько точек с одинаковыми углами, оставить только самую дальнюю. Push(P 0); Push(P 1); i : = 2; while i < N do begin PT 1 : = точка в верхушке стека; PT 2 : = вторая сверху точка в стеке; if Left(P[i], PT 2, PT 1) then begin Push(P[i]); i : = i + 1; end else Pop(PT 1); {Выбрасываем точку} end; {В стеке остались точки выпуклой оболочки} P 4 P 1 P 2 P 6 P 7 P 5 P 3 P? P 0 T(n) = O(n·log(n))
Выпуклая оболочка множества точек: метод Эндрю 11 {Pi} – исходный набор из N точек; W – стек точек. Отсортировать все точки по возрастанию x, а при равенстве x по возрастанию y. {Для простоты рассмотрим только точки сверху (Left(Pi, P 0, Pn-1) = True)} Push(P 0); Push(P 1); i : = 2; while i < N do begin PT 1 : = точка в верхушке стека; PT 2 : = вторая сверху точка в стеке; if Right(Pi, PT 2, PT 1) then begin Push(Pi); i : = i + 1; end else Pop(PT 1); {Выбрасываем точку} end; {В стеке точки верхней половины выпуклой оболочки; нижняя половина находится аналогично, затем они сливаются} P 5 P 1 P 0 P 8 P 2 P 4 P 3 P 10 P 7 P 9 P 6 T(n) = O(n·log(n))
Мелкие советы n Не верьте в равенство вещественных чисел. q q n n cos 2(x) + sin 2(x) = 1. 0 ? Очень сомнительно. . . abs(cos 2(x) + sin 2(x) – 1. 0) ? Возможно, при правильном выборе . Забудьте формулу Герона. Для очень узких треугольников она дает нулевую площадь. Пользуйтесь векторным произведением сторон. Рассматривайте все случаи взаимного расположения фигур. q Два отрезка могут лежать, например, так: q n 12 Два круга: Обращайте внимание на знак результата, он может иметь важный