Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

0085730_32E51_mosin_v_g_matematicheskie_osnovy

.pdf
Скачиваний:
31
Добавлен:
12.03.2016
Размер:
1.22 Mб
Скачать

3.3. Пример алгоритма покадровой анимации

71

нужного нам плоского преобразования η в матричной форме необходимо сначала преобразовать плоскость так, чтобы прямая l совпала с одной из осей. Проще всего совместить ее с горизонтальной осью Ox, для этого достаточно сместить плоскость на вектор b = (0, −2). После этого можно будет выполнить горизонтальное отражение Qx, и, наконец, обратное смещение на вектор −b = (0, 2).

η = T−bQxTb =

0

1

2

0

1

0

0

1

2

=

 

1

0

0

1

0

0

1

 

0

 

 

0

0

1 0

0

1 0

0

1

 

10 0

= 0 1 4 .

00 1

Теперь можно вычислить координаты результирующего треугольника просто при помощи матричного умножения.

A = η (A) =

0

1

4

 

3

=

1

 

 

таким образом

A (2, 1).

 

 

1

0

0

 

2

 

2

 

 

 

 

 

0

0

1 1 1

 

 

 

B = η (B) =

0

1 4

 

5

=

1

и, значит, B (2, −1).

 

 

1

0 0

 

2

 

 

2

 

 

 

 

0

0 1 1

 

1

 

 

 

 

1

0

0

 

4

=

4

 

 

 

C = η (C) =

0

1

4

3

1

следовательно,

C (4, 1).

 

 

0

0

1

 

1

 

1

 

 

 

3.3Пример алгоритма покадровой анимации

y

 

B

C

A

D

H

 

0

x

Рис. 3.4: Квадрат ABCD, коллапси-

рующий в точку H.

 

В этом разделе мы, пользуясь полученными выше знаниями о плоских преобразованиях выполним покадровое движение плоской фигуры.

Такую задачу мы можем рассматривать с различных точек зрения.

Если перед нами — чистый лист бумаги, то покадровое движение изображения по нему мы с вами будем осуществлять не более, чем интуитивно, пользуясь представлениями о геометрической природе объекта изображения и навыками геометрических построений.

Однако, если перед нами стоит задача осуществить программную реализацию целого класса однотипных преобразований, то нам понадобится механизм формализации данных о точках плоскости и ее преобразованиях. Такой механизм мы получили, пользуясь средствами линейной алгебры и

72

Глава 3. Проективные операторы

проективной геометрии. Они позволяют передать процессору данные в численном виде: в виде одномерных (координаты точек и векторов) или двумерных (компоненты матриц проективных операторов) массивов чисел.

Мы отдельно рассмотрим геометрический, аналитический и программный подход к решинию задачи.

Постановка задачи

Квадрат ABCD с вершинами A(3, 3), B(3, 5), C(5, 3), D(5, 3) движется из своего исходного положения в точку H(2, 1), при этом происходит равномерное масштабирование квадрата до его полного вырождения в точке H (см. рис. 3.4, стр. 71).

3.3.1Геометрическая версия алгоритма

С геометрической точки зрения нужно решить задачу на построение (не самую сложную). Нам достаточно соединить вершины исходного квадрата с точкой полного коллапса отрезками прямых и каждый такой отрезок разбить на n равных частей (это, напомню, делается при помощи циркуля и линейки по теореме Фалеса). После этого точки на прямых и будут вершинами квадрата в его промежуточных стадиях.

3.3.2

Аналитическая версия алгоритма

 

 

 

Выполним десять кадров движения.

 

y

 

В каждом кадре происходят одно-

 

 

 

типные операции (что позволит нам

 

 

 

в следующем разделе построить про-

 

 

G

граммный цикл), которые состоят

 

 

в следующем.

 

a

 

 

 

Пусть G — центр квадрата. Совер-

 

 

 

 

bk

b

шенно нетрудно вычислить его ко-

 

 

ординаты:

H

 

 

 

 

 

 

0

x

G(4, 4)

 

 

 

(см. рис. 3.5, стр. 72). Тогда в каж-

 

 

 

дом кадре сначала происходит сме-

Рис. 3.5: Векторы смещений, участву-

щение Tb плоскости на вектор

ющие в анимации.

b = GO = (4, −4) .

 

 

При этом центр квадрата совмещается с началом координат.

Затем происходит равномерное масштабирование плоскости с коэффициентом, зависящим от номера кадра: в первом кадре это 0.9, во втором — это 0.8 и т. д.

И, наконец, отмасштабированный квадрат возвращается в точку, промежуточную между G и H.

3.3. Пример алгоритма покадровой анимации

73

Вектор bk соответствующей трансляции также зависит от номера кадра:

bk = −b + (k/10)a ,

где a — это вектор, соединяющий центр квадрата с точкой H (нетрудно подсчитать, что в нашем случае a = (6, −3)).

1-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0, 9. После этого плоскость смещается на вектор b1:

b1 = −b +

1

· a = (4, 4) +

1

(6, −3) = (3.4, 3.7) .

10

10

Следовательно, оператор η1, который действует в первом кадре, обладает следующей матрицей:

η1 = Tb1 S0.9Tb =

0

 

 

0

 

4

 

=

0

1

3.7

0.9

0

1

=

 

 

1

0

3.4

 

0.9

0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

00

0.9

0.1 .

 

 

 

 

 

 

 

 

 

.9

0

0.2

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в первом кадре:

A1

= η1(A) =

0

0.9

0.1

3

=

2.8 .

 

 

0.9

0

0.2

3

 

2.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A1 в первом кадре таковы: A1(2.5, 2.8). Аналогично поступим со второй вершиной:

B1

= η1(B) =

0

0.9

0.1

5

=

4.6 .

 

 

0.9

0

0.2

3

 

2.5

 

 

0

0

1 1

1

Значит, декартовы координаты второй вершины B1 в первом кадре таковы: B1(2.5, 4.6). Далее — аналогичным образом поступим с третьей вершиной:

C1

= η1(C) =

0

0.9

0.1

5

=

4.6 .

 

 

0.9

0

0.2

5

 

4.3

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C1 в первом кадре таковы: C1(4.3, 4.6). Наконец, аналогично поступим с четвертой вершиной:

D1

= η1(D) =

0

0.9

0.1

3

=

2.8 .

 

 

0.9

0

0.2

5

 

4.3

 

 

0

0

1 1

1

74

Глава 3. Проективные операторы

Поэтому, декартовы координаты четвертой вершины D1 в первом кадре таковы: D1(4.3, 2.8). Окончательно, координаты вершин квадрата в первом кадре:

A1(2.5, 2.8) , B1(2.5, 4, 6) , C1(4.3, 4.6) , D1(4.3, 2.8) .

2-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.8. После этого плоскость смещается на вектор b2:

b2 = −b +

2

· a = (4, 4) +

2

(6, −3) = (2.8, 3.4) .

10

10

Следовательно, оператор η2, который действует во втором кадре, обладает следующей матрицей:

η2 = Tb2 S0.8Tb =

=

0

1

3.4

0

0.8

0

0

1

4

=

 

 

1

0

2.8

 

0.8 0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

0

0.8

0.2 .

 

 

 

 

 

 

 

0.8

0

0.4

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата во втором кадре:

A2

= η2(A) =

0

0.8

0.2

3

=

2.6 .

 

 

0.8

0

0.4

3

 

2

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A2 во втором кадре таковы: A2(2, 2.6). Аналогично поступим со второй вершиной:

B2

= η2(B) =

0

0.8

0.2

5

=

4.2 .

 

 

0.8

0

0.4

3

 

2

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B2 во втором кадре таковы: B2(2, 4.2). Далее — аналогично поступим с третьей вершиной:

C2

= η2(C) =

0

0.8

0.2

5

=

4.2 .

 

 

0.8

0

0.4

5

 

3.6

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C2 во втором кадре таковы: C2(3.6, 4.2). Далее —аналогично поступим с четверотой вершиной:

D2

= η2(D) =

0

0.8

0.2

3

=

2.6 .

 

 

0.8

0

0.4

5

 

3.6

 

 

0

0

1 1

1

3.3. Пример алгоритма покадровой анимации

75

Следовательно, декартовы координаты четвертой вершины D2 во втором кадре таковы: D2(3.6, 2.6). Окончательно, координаты вершин квадрата во втором кадре:

A2(2, 2.6) , B2(2, 4, 2) , C2(3.6, 4.2) , D2(3.6, 2.6) .

3-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.7. После этого плоскость смещается на вектор b3:

b3 = −b +

3

· a = (4, 4) +

3

(6, −3) = (2.2, 3.1) .

10

10

Следовательно, оператор η3, который действует в третьем кадре, обладает следующей матрицей:

η3 = Tb3 S0.7Tb =

0

 

 

0

 

4

 

=

0

1

3.1

0.7

0

1

=

 

 

1

0

2.2

 

0.7

0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

0

0.7

0.3 .

 

 

 

 

 

 

 

 

0.7

0

0.6

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в третьем кадре:

A3

= η3(A) =

0

0.7

0.3

3

=

2.4 .

 

 

0.7

0

0.6

3

 

1.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A3 в третьем кадре таковы: A3(1.5, 2.4). Аналогично поступим со второй вершиной:

B3

= η3(B) =

0

0.7

0.3

5

=

3.8 .

 

 

0.7

0

0.6

3

 

1.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B3 в третьем кадре таковы: B3(1.5, 3.8). Далее — аналогично поступим с третьей вершиной:

C3

= η3(C) =

0

0.7

0.3

5

=

3.8 .

 

 

0.7

0

0.6

5

 

2.9

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C3 в третьем кадре таковы: C3(2.9, 3.8). Далее — аналогично поступим с четверотой вершиной:

D3

= η3(D) =

0

0.7

0.3

3

=

2.4 .

 

 

0.7

0

0.6

5

 

2.9

 

 

0

0

1 1

1

76

Глава 3. Проективные операторы

Следовательно, декартовы координаты четвертой вершины D3 в третьем кадре таковы: D3(2.9, 2.4). Окончательно, координаты вершин квадрата в третьем кадре:

A3(1.5, 2.4) , B3(1.5, 3.8) , C3(2.9, 3.8) , D3(2.9, 2.4) .

4-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.6. После этого плоскость смещается на вектор b4:

b4 = −b +

4

· a = (4, 4) +

4

(6, −3) = (1.6, 2.8) .

10

10

Следовательно, оператор η4, который действует в четвертом кадре, обладает следующей матрицей:

η4 = Tb4 S0.6Tb =

=

0

1

2.8

0

0.6

0

0

1

4

=

 

 

1

0

1.6

 

0.6 0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

0

0.6

0.4 .

 

 

 

 

 

 

 

0.6

0

0.8

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в четвертом кадре:

A4

= η4(A) =

0

0.6

0.4

3

=

2.2 .

 

 

0.6

0

0.8

3

 

1

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A4 в четвертом кадре таковы: A4(1, 2.2). Аналогично поступим со второй вершиной:

B4

= η4(B) =

0

0.6

0.4

5

=

3.4 .

 

 

0.6

0

0.8

3

 

1

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B4 в четвертом кадре таковы: B4(1, 3.4). Далее — аналогично поступим с третьей вершиной:

C4

= η4(C) =

0

0.6

0.4

5

=

3.4 .

 

 

0.6

0

0.8

5

 

2.2

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C4 в четвертом кадре таковы: C4(2.2, 3.4). Далее — аналогично поступим с четвертой вершиной:

D4

= η4(D) =

0

0.6

0.4

3

=

2.2 .

 

 

0.6

0

0.8

5

 

2.2

 

 

0

0

1 1

1

3.3. Пример алгоритма покадровой анимации

77

Следовательно, декартовы координаты четвертой вершины D4 в четвертом кадре таковы: D4(2.2, 2.2). Окончательно, координаты вершин квадрата в четвертом кадре:

A4(1, 2.2) , B4(1, 3.4) , C4(2.2, 3.4) , D4(2.2, 2.2) .

5-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.5. После этого плоскость смещается на вектор b5:

b5 = −b +

5

· a = (4, 4) +

5

(6, −3) = (1, 2.5) .

10

10

Следовательно, оператор η5, который действует в пятом кадре, обладает следующей матрицей:

η5 = Tb5 S0.5Tb =

=

0

1

2.5

0

0.5

0

0

1

4

=

 

 

1

0

1

 

0.5

0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

0

0.5

0.5 .

 

 

 

 

 

 

 

 

0.5

0

1

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в пятом кадре:

A5

= η5(A) =

0

0.5

0.5

3

=

2 .

 

 

0.5

0

1

3

 

0.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A5 в пятом кадре таковы: A5(0.5, 2). Аналогично поступим со второй вершиной:

B5

= η5(B) =

0

0.5

0.5

5

=

3 .

 

 

0.5

0

1

3

 

0.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B5 в пятом кадре таковы: B5(0.5, 3). Далее — аналогично поступим с третьей вершиной:

C5

= η5(C) =

0

0.5

0.5

5

=

3 .

 

 

0.5

0

1

5

 

1.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C5 в пятом кадре таковы: C5(1.5, 3). Далее — аналогично поступим с четвертой вершиной:

D5

= η5(D) =

0

0.5

0.5

3

=

2 .

 

 

0.5

0

1

5

 

1.5

 

 

0

0

1 1

1

78

Глава 3. Проективные операторы

Следовательно, декартовы координаты четвертой вершины D5 в пятом кадре таковы: D5(1.5, 2). Окончательно, координаты вершин квадрата в пятом кадре:

A5(0.5, 2) , B5(0.5, 3) , C5(1.5, 3) , D5(1.5, 2) .

6-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.4. После этого плоскость смещается на вектор b6:

b6 = −b +

6

· a = (4, 4) +

6

(6, −3) = (0.4, 2.2) .

10

10

Следовательно, оператор η6, который действует в шестом кадре, обладает следующей матрицей:

η6 = Tb6 S0.4Tb =

0

 

 

0

 

4

 

=

0

1

2.2

0.4

0

1

=

 

 

1

0

0, 4

 

0.4

0

0

1

0

4

 

 

0

0

1 0

0

1 0

0

1

 

=

0

0.5

0.6 .

 

 

 

 

 

 

 

 

0.5

0

1.2

 

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в шестом кадре:

A6

= η6(A) =

0

0.4

0.6

3

=

1.8 .

 

 

0.4

0

1.2

3

 

0

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A6 в шестом кадре таковы: A6(0, 1.8). Аналогично поступим со второй вершиной:

B6

= η6(B) =

0

0.4

0.6

5

=

2.6 .

 

 

0.4

0

1.2

3

 

0

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B6 в шестом кадре таковы: B6(0, 2.6). Далее — аналогично поступим с третьей вершиной:

C6

= η6(C) =

0

0.4

0.6

5

=

2.6 .

 

 

0.4

0

1.2

5

 

0.8

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C6 в шестом кадре таковы: C6(0.8, 2.6). Далее — аналогично поступим с четвертой вершиной:

D6

= η6(D) =

0

0.4

0.6

3

=

1.8 .

 

 

0.4

0

1.2

5

 

0.8

 

 

0

0

1 1

1

3.3. Пример алгоритма покадровой анимации

79

Следовательно, декартовы координаты четвертой вершины D6 в шестом кадре таковы: D6(0.8, 1.8). Окончательно, координаты вершин квадрата в шестом кадре:

A6(0, 1.8) , B6(0, 2.6) , C6(0.8, 2.6) , D6(0.8, 1.8) .

7-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.3. После этого плоскость смещается на вектор b7:

b7 = −b +

7

· a = (4, 4) +

7

(6, −3) = (0.2, 1.9) .

10

10

Следовательно, оператор η7, который действует в седьмом кадре, обладает следующей матрицей:

η7 = Tb7 S0.3Tb =

 

0

 

 

0

 

4

 

=

0

1

1.9

0.3

0

1

=

 

 

1

0

 

0.2

 

0.3

0

0

1

0

4

 

 

0

0

 

1 0

0

1 0

0

1

 

=

0

0.3

0.7 .

 

 

 

 

 

 

 

 

0.3

0

 

1.4

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в седьмом кадре:

A7

= η7(A) =

0

0.3

0.7

3

=

1.6 .

 

 

0.3

0

1.4

3

 

0.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A7 в седьмом кадре таковы: A7(0.5, 1.6). Аналогично поступим со второй вершиной:

B7

= η7(B) =

0

0.3

0.7

5

=

2.2 .

 

 

0.3

0

1.4

3

 

0.5

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B7 в седьмом кадре таковы: B7(0.5, 2.2). Далее — аналогично поступим с третьей вершиной:

C7

= η7(C) =

0

0.3

0.7

5

=

2.2 .

 

 

0.3

0

1.4

5

 

0.1

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C7 в седьмом кадре таковы: C7(0.1, 2.2). Далее — аналогично поступим с четверотой вершиной:

D7

= η7(D) =

0

0.3

0.7

3

=

1.6 .

 

 

0.3

0

1.4

5

 

0.1

 

 

0

0

1 1

1

80

Глава 3. Проективные операторы

Следовательно, декартовы координаты четвертой вершины D7 в седьмом кадре таковы: D7(0.1, 1.6). Окончательно, координаты вершин квадрата в седьмом кадре:

A7(0.5, 1.6) , B7(0.5, 2.2) , C7(0.1, 2.2) , D7(0.1, 1.6) .

8-й кадр

Здесь сначала происходит смещение плоскости на вектор b = (4, −4) для совмещения центра исходного квадрата с началом координат. Затем плоскость равномерно масштабируется с коэффициентом 0.2. После этого плоскость смещается на вектор b8:

b8 = −b +

8

· a = (4, 4) +

8

(6, −3) = (0.8, 1.6) .

10

10

Следовательно, оператор η8, который действует в восьмом кадре, обладает следующей матрицей:

η8 = Tb8 S0.2Tb =

=

0

1

1.6

0

0.2

0

0

1

4

=

 

 

1

0

 

0.8

 

0.2 0

0

1

0

4

 

 

0

0

 

1 0

0

1 0

0

1

 

=

0

0.2

0.8 .

 

 

 

 

 

 

 

 

0.2

0

 

1.6

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

При помощи матричного умножения вычислим координаты вершин квадрата в восьмом кадре:

A8

= η8(A) =

0

0.2

0.8

3

=

1.4 .

 

 

0.2 0

1.6

3

 

1

 

 

0

0

1 1

1

Следовательно, декартовы координаты первой вершины A8 в восьмом кадре таковы: A8(1, 1.4). Аналогично поступим со второй вершиной:

B8

= η8(B) =

0

0.2

0.8

5

=

1.8 .

 

 

0.2

0

1.6

3

 

1

 

 

0

0

1 1

1

Следовательно, декартовы координаты второй вершины B8 в восьмом кадре таковы: B8(1, 1.8). Далее — аналогично поступим с третьей вершиной:

C8

= η8(C) =

0

0.2

0.8

5

=

1.8 .

 

 

0.2 0

1.6

5

 

0.6

 

 

0

0

1 1

1

Следовательно, декартовы координаты третьей вершины C8 в восьмом кадре таковы: C8(0.6, 1.8). Далее — аналогично поступим с четверотой вершиной:

D8

= η8(D) =

0

0.2

0.8

3

=

1.4 .

 

 

0.2

0

1.6

5

 

0.6

 

 

0

0

1 1

1