Автор: Пользователь скрыл имя, 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