Автор: Пользователь скрыл имя, 02 Октября 2011 в 22:47, лекция
Векторы и операции над ними
Векторы
Прямые
Отрезки
Полигоны
Выпуклые оболочки
План лекции:
автор: С.Н. Дроздов
Вычислительная геометрия
2
Векторы и операции над ними
r = (r.x, r.y);
r.x = x1 – x0, r.y = y1 – y0;
q = (q.x, q.y);
q.x
= x2 – x0, q.y = y2 – y0;
r·q = r.x·q.x + r.y·q.y ;
Длина вектора: |r| = Sqrt(r·r);
Вид угла между векторами:
r·q > 0 – острый;
r·q = 0 – прямой;
r·q < 0 – тупой.
rq = (xryq – xqyr)z;
(z – единичный вектор оси Z).
Площадь треугольника со сторонами r и q: S = ½ |rq|.
Знак векторного
произведения указывает
sin() = |rq| / (|r|·|q|) – со знаком!
cos() = |r·q| / (|r|·|q|)
3
Прямые
dx·(y – y1) = dy·(x – x1),
где dx
= x2 – x1, dy = y2 – y1
или Ax + By –
C = 0
где A = dy, B = –
dx, C = dy·x1 –
dx·y1
n = (–dy / dxy, dx / dxy)
где dxy = sqrt(dx2 + dy2)
R · n = w
где
R = (x, y) – радиус-вектор текущей точки,
w = (x2·y1 – x1·y2).
dxy = sqrt(dx2
+ dy2)
P
(x1, y1)
Q
(x2, y2)
dx
dy
n
dxy
4
Прямые (продолжение)
x = x1 + dx·t
y = y1 + dy·t
d = |R · n – w|
или
d = |dx·(y0 – y1) - dy·(x0 – x1)|
Left(R, P, Q) = (R · n > w)
или
dx·(y0 – y1) - dy·(x0 – x1) > 0
Аналогично
Right(R, P, Q) = (R · n < w)
или
dx·(y0
– y1) - dy·(x0 – x1) < 0
P
(x1, y1)
Q
(x2, y2)
dx
dy
n
d
d
Left
Right
R (x0, y0)
5
Взаимное расположение прямых
A1B2 – A2B1 0
x = (A1C2 – C1A2) / (A1B2 – A2B1)
y = (C1B2 – B1C2) / (A1B2 – A2B1)
B1x –
A1y + (A1y0 – B1x0) = 0
P
(x1, y1)
Q
(x2, y2)
dx
dy
n
R (x0, y0)
6
Отрезки
min(x1, x2) x max(x1, x2)
min(y1, y2) y max(y1, y2)
0 t 1
dxy = sqrt(dx2
+ dy2)
P
(x1, y1)
Q
(x2, y2)
dx
dy
dxy
R1
R2
7
Полигоны (многоугольники)
Это правильно работает и в случае невыпуклого полигона.
В
примере: знаки площади
двух заштрихованных треугольников противоположные.
q1
q2
q3
8
Полигоны (продолжение)
сумма углов поворота при обходе границы может быть равна:
2 - внутренняя область полигона слева от контура обхода;
- 2
- внутренняя область полигона справа
от контура обхода.
9