
- •Лабораторный практикум по курсу
- •Введение
- •Панель элементов управления
- •3. Label Метка
- •4. TextBox Текстовое окно
- •6. CommandButton Командная кнопка
- •9. Combo Box Комбинированный список
- •10. List Box Список
- •12. Vertical Scroll Bar Вертикальная линейка прокрутки
- •13. Timer Таймер
- •14. Drive List Box Список дисков
- •15. Directory List Box Список каталогов
- •16. File List Box Список файлов
- •18. Line Линия
- •Image Изображение
- •Примеры основных процедур, которые используются в лабораторных работах
- •Cls ‘ Clear screen – очистка экрана
- •Пример 7. Остановить выполнение программы
- •Unload Me ‘ выгрузить форму
- •Принципы выполнения лабораторных работ:
- •Последовательность выполнения лабораторной работы
- •Лабораторная работа № 1:
- •Лабораторные основы
- •Лабораторная работа № 2:
- •Математические основы
- •Часть I. "Установка основных параметров для рисования"
- •Часть II "Основные события мыши"
- •Часть III "Создание кисти"
- •Лабораторная работа № 3:
- •Математические основы
- •Простейший алгоритм построения отрезка
- •Алгоритм Брезенхема для построения отрезка.
- •Растровые алгоритмы построения окружности.
- •Лабораторные основы
- •Лабораторная работа № 4:
- •Математические основы
- •1. Кусочно-линейный
- •2. Линейно-круговой
- •3. Полиномиальный
- •Лабораторные основы
- •Лабораторная работа № 5:
- •Математические основы
- •Лабораторные основы
- •Лабораторная работа № 6:
- •Математические основы
- •Лабораторные основы
- •Двумерные преобразования на плоскости
- •Лабораторная работа № 7:
- •Математические основы
- •1916 Бернштейн :
- •1) Кривые Безье
- •Лабораторные основы
- •Метод наименьших квадратов
- •Интерполяционный многочлен Лагранжа
- •Лабораторная работа № 8:
- •Математические основы
- •Лабораторные основы
- •Словарь основных терминов среды Visual Basic Англо-русский словарь
- •Русско-английский словарь
- •Список использованной литературы
Лабораторная работа № 6:
"Геометрические преобразования.
Сдвиг, масштабирование, поворот, симметрия"
Математические основы
Двумерные преобразования
Преобразование точек
Точка представляется на плоскости двумя своими координатами, которые определяются как элементы матрицы размером 1х2 [х у]. В трехмерном пространстве используется матрица размером 1х3 [x у z]. Иначе говоря, точка может задаваться в виде вектор-столбца
|
|
|
|
x y |
|
|
|
|
в двумерном пространстве или в виде
|
|
|
|
x y z |
|
|
|
|
в трехмерном. Строку [х у] или столбец часто называют координатным вектором. Для формирования такого вектора используется матрица-строка, т. е. множество точек, каждая из которых определяет координатный вектор в некоторой системе измерения. Данное множество хранится в виде матрицы или массива чисел. Положением точек можно управлять путем манипулирования соответствующей матрицей. Линии, соединяющие точки, формируют отрезки, кривые и картинки.
В качестве элементов матрицы могут фигурировать различные величины: числа, сетки или коэффициенты системы уравнений. Правила в матричной алгебре определяют допустимые операции над элементами. Многие физические задачи удобно выражаются в матричном представлении. Для моделей физических систем задача обычно ставится следующим образом: даны матрицы [А] и [В], найти результирующую матрицу [Т], такую, что [А][Т] = [В]. В этом случае решением является матрица [Т] = [А]-1[В], где [А]-1 - матрица, обратная к квадратной матрице [А].
В то же время матрицу [Т] можно интерпретировать как геометрический оператор. В этом случае для выполнения геометрического преобразования точек, представленных векторами положений в матрице [А], используется умножение матриц. Предположим, что матрицы [А] и [T] известны. Требуется определить элементы матрицы [В]. Представление [T] как геометрического оператора является основой математических преобразований, используемых в машинной графике.
Рассмотрим результаты умножения матрицы [х у], содержащей координаты точки Р, на матрицу общего преобразования размером 2х2:
|
|
|
|
|
[X][T] = [x y] |
|
a b c d |
|
[(ax + cy) (bx + dy)] |
|
|
|
|
|
Данная запись означает, что исходные координаты точки х и у преобразуются в х* и y*, где где х* = ах + су, у* = bх + dy. Представляют интерес значения х*, у* - координаты результирующей, преобразованной точки Р. Рассмотрим некоторые специальные случаи.
При а = d = 1 и с = b = 0 преобразование сведется к единичной матрице
|
|
|
|
|
[X][T] = [x y] |
|
1 0 0 1 |
|
[x y] = [x* y*] |
|
|
|
|
|
и координаты точки Р останутся неизменными. Как и следовало ожидать, в линейной алгебре умножение на единичную матрицу эквивалентно умножению на 1 в обычной алгебре.
В случае d = 1, b = c = 0
|
|
|
|
|
[X][T] = [x y] |
|
а 0 0 1 |
|
[аx y] = [x* y*] |
|
|
|
|
|
где х* = ах - результат масштабирования координаты х. Эффект показан на рисунке 1.1,а.
Рассмотрим теперь еще случай b = с = 0, т.е.
|
|
|
|
|
[X][T] = [x y] |
|
а 0 0 d |
|
[аx yd] = [x* y*] |
|
|
|
|
|
Данное преобразование вызывает изменение обеих координат х и у вектора Р (рис. 1.1,b). Если а <> d, то координаты масштабируются различным образом. При a = d > 1 происходит растяжение вектора Р или масштабирование координат. Если 0 < а = d < 1, то имеет место сжатие.
Если значение а или d отрицательное, то вектор отражается относительно координатных осей или относительно плоскости. Чтобы убедиться в этом, возьмем b = c = 0, d = 1 и а = 1, тогда
|
|
|
|
|
[X][T] = [x y] |
|
-1 0 0 1 |
|
[-x y] = [x* y*] |
|
|
|
|
|
и в результате получаем симметричное отражение относительно оси y (рис. 1.1,c). Если b = c = 0, а = 1, d = -1, то выполняется симметричное отражение относительно оси х. Если b = с = 0, а = d < 0, то происходит отражение относительно начала координат, это показано на рисунке 1.1,d, где a = -1, d =1. Заметим, что обе операции отражения и масштабирование зависят только от диагональных членов матрицы преобразования.
Рассмотрим теперь случай с недиагональными членами. Возьмем сначала значения a = d = 1, c = 0, тогда
|
|
|
|
|
[X][T] = [x y] |
|
1 b 0 1 |
|
[x (bx + y)] = [x* y*] |
|
|
|
|
|
Заметим, что координата х точки Р осталась неизменной, тогда как координата y линейно зависит от исходных координат. Данное преобразование называется сдвигом (рис. 1.1,e). Аналогично, в случае, когда а = d = 1, b = 0, преобразование приведет к сдвигу пропорционально координате y (рис. 1.1,f). Таким образом, видно, что недиагональные члены матрицы преобразования создают эффект сдвига координат вектора точки Р.
Прежде чем закончить с преобразованием точек, разберем действие общего преобразования, когда начальный вектор лежит в точке начала координат, т.е.
|
|
|
|
|
[X][T] = [x y] |
|
a b c d |
|
[(ax + cy) (bx + dy)] |
|
|
|
|
|
или в случае начала координат,
|
|
|
|
|
[X][T] = [0 0] |
|
a b c d |
|
[0 0] = [x* y*] |
|
|
|
|
|
Видно, что начало координат инвариантно относительно преобразования общего вида. Это ограничение устраняется при использовании однородных координат.
Преобразование параллельных линий
Прямую линию можно определить с помощью двух векторов, задающих координаты ее конечных точек. Расположение и направление линии, соединяющей две эти точки, может изменяться в зависимости от положения векторов.
Результатом преобразования двух параллельных линий с помощью (2х2)-матрицы снова будут две параллельные линии. Это можно увидеть, рассмотрев линию между точками [А] = [x1 y1], [В] = [х2 y2] и параллельную ей линию, проходящую между точками E и F. Покажем, что для этих линий любое преобразование сохраняет параллельность. Так как АВ, EF и A*B* и E*F* параллельны, то угол наклона линий АВ и EF определяется следующим образом:
m = |
y2
- y1
|
Преобразуем конечные точки АВ, воспользовавшись матрицей общего преобразования размером (2х2):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A B |
|
[T] = |
|
x1 y1 x2 y2 |
|
|
|
a b c d |
|
= |
|
ax1 + cy1 bx1 + dy1 ax2 + cy2 bx2 + dy2 |
|
= |
|
x1* y1* x2* y2* |
|
= |
|
A* B* |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Наклон прямой А*В* определяется следующим образом:
m* = |
(bx2
+ dy2)
- (bx1
+ dy1)
|
= |
b(x2
- x1)
+ d(y2
- y1)
|
или
m* = |
b + d |
(y2
- y1)
|
= |
b
+ dm
|
|
| |||
a + c |
(y2
- y1)
|
Так как наклон m* не зависит от х1, х2, y1, y2, а m, а, b, с и d одинаковы для EF и AB, то m* одинаково для E*F* и А*В*. Таким образом, параллельные линии сохраняют параллельность и после преобразования. Это означает, что при преобразовании (2х2) параллелограмм преобразуется в другой параллелограмм. Эти тривиальные выводы демонстрируют большие возможности использования матрицы преобразования для создания графических эффектов.
Преобразование пересекающихся прямых
Результатом преобразования с помощью (2х2)-матрицы пары пересекающихся прямых линий также будет пара пересекающихся линий. Проиллюстрируем это на примере двух прямых, заданных уравнениями:
y = m1x + b1 y = m2x + b2
В матричном представлении эти уравнения будут иметь вид:
|
|
|
|
|
[X][T] = [x y] |
|
-m1 -m2 1 1 |
|
= [b1 b2] |
|
|
|
|
|
или
[X][M] = [B]
Если существует решение этой системы уравнений, то линии пересекаются, в противном случае они параллельны. Решение можно найти путем инверсии матрицы. В частности,
[Xi] = [xi yi] = [B][M] -1
Матрица, обратная [М], имеет следующий вид:
|
|
|
| ||||
|
|
|
1
|
|
m2
|
| |
|
|
|
|
так как [M][M] -1 = [E], где [E] - единичная матрица. Поэтому координаты точки пересечения двух линий можно найти следующим образом:
|
|
|
| ||||
[Xi] = [xi yi] = [b1 b2] |
|
|
1
|
|
m2
|
| |
|
|
|
|
|
|
|
| ||||
[Xi] = [xi yi] = |
|
|
b1
– b2
|
|
b1m2
- b2m1
|
| |
|
|
|
|
Если обе линии преобразовать с помощью (2х2)-матрицы общего преобразования вида:
|
|
|
|
[T] = |
|
a b c d |
|
|
|
|
|
то их уравнения будут иметь вид
y* = m1*x* + b1* y* = m2*x* + b2*
Соответственно можно показать, что
mi* = |
b
+ dmi
|
и
bi* = bi(d - cmi*) = bi |
ad
- bc
|
где i = 1, 2. |
Точка пересечения линий после преобразования отыскивается таким же образом, что и в случае исходных линий:
|
|
|
| ||||
[Xi*] = [xi* yi*] = |
|
|
b1*
- b2*
|
|
b1*m2*
- b2*m1*
|
| |
|
|
|
|
Воспользовавшись тремя предыдущими выражениями, получим:
|
|
|
| ||||
[Xi*] = [xi* yi*] = |
|
|
a(b1
- b2)
+ c(b1m2
– b2m1)
|
|
b(b1
- b2)
+ d(b1m2
- b2m1)
|
| |
|
|
|
|
Возвращаясь теперь к точке пересечения [xi yi] исходных линий и применяя уже полученную матрицу преобразования, имеем
|
|
|
|
|
|
|
|
| ||||
[xi* yi*] = [xi yi][T] = |
|
|
b1
– b2
|
|
b1m2
- b2m1
|
|
|
|
a b c d |
|
= | |
|
|
|
|
|
|
|
|
|
|
|
|
| ||||
= |
|
|
a(b1
- b2)
+ c(b1m2
– b2m1)
|
|
b(b1
- b2)
+ d(b1m2
- b2m1)
|
| |
|
|
|
|
Сравнение уравнений точек пересечения исходных линий и преобразованных показывает, что они одинаковы. Итак, точка пересечения преобразуется точно в другую точку пересечения.
Поворот
Рассмотрим треугольник ABC (рис.1.2) и с помощью следующего преобразования повернем его на 90° против часовой стрелки относительно начала координат
|
|
|
|
[T] = |
|
0 1 -1 0 |
|
|
|
|
|
Если использовать матрицу (3 х 2), состоящую из координат x и y вершин треугольника, то можно записать
|
|
|
|
|
|
|
|
| |||||||||
|
3 -1 4 1 2 1 |
|
|
|
= |
|
3 -1 4 1 2 1 |
| |||||||||
|
|
|
|
|
|
|
|
|
что является координатами результирующего треугольника A*B*C*. Поворот нв 180° относительно начала координат достигается путем следующего преобразования
|
|
|
|
[T] = |
|
-1 0 0 -1 |
|
|
|
|
|
а на 270° относительно начала координат - преобразованием
|
|
|
|
[T] = |
|
0 -1 1 0 |
|
|
|
|
|
Разумеется, что матрица тождественного преобразования
|
|
|
|
[T] = |
|
1 0 0 1 |
|
|
|
|
|
соответствует повороту вокруг начала координат на 0° или на 360°.
Как осуществить поворот вокруг точки начала координат на произвольный угол θ? Для ответа на этот вопрос рассмотрим вектор положения от начала координат до точки Р (рис. 1.3). Обозначим r - длину вектора, а φ - угол между вектором и осью х. Вектор положения поворачивается вокруг начала координат на угол θ и попадает в точку Р*. Записав векторы положений для Р и Р*, получаем:
Р = [х у] = [r cosφ r sinφ]
и
Р* = [x* у*] = [r соs(θ + φ) r sin(θ + φ].
Используя формулу для cos суммы углов, перепишем выражение для Р* следующим образом
Р* = [x* у*] = [r(cosφcosθ - sinφsinθ) r(соsφsinθ + sinφcosθ)].
Используя определения х и у, можно переписать Р* как
Р* = [x* у*] = [x cosθ - y sinθ x sinθ + y cosθ].
Таким образом, преобразованная точка имеет координаты
x* = x cosθ - y sinθ y* = x sinθ + y cosθ.
Или в матричном виде
|
|
|
|
[X*] = [X][T] = [x* y*] = [x y] |
|
cosθ sinθ -sinθ cosθ |
|
|
|
|
|
Итак, преобразование поворота вокруг точки начала координат на произвольный угол θ задается матрицей
|
|
|
|
[T] = |
|
cosθ sinθ -sinθ cosθ |
|
|
|
|
|
Отражение
В то время как полный поворот на плоскости xy обычно осуществляется в двумерном пространстве относительно нормали к плоскости, отражение представляет собой тот же поворот на угол 180° в трехмерном пространстве и обратно на плоскость относительно оси, лежащей в плоскости xy. На рис. 1.4 приведены примеры двух отражений на плоскости треугольника DEF. Отражение относительно прямой y = 0 (ось x) получено с использованием матрицы
|
|
|
|
[T] = |
|
1 0 0 -1 |
|
|
|
|
|
В этом случае новые вершины треугольника D*E*F* будут определяться преобразованием
|
|
|
|
|
|
|
|
| |||||||||
|
8 1 7 3 6 2 |
|
|
|
= |
|
8 -1 7 -3 6 -2 |
| |||||||||
|
|
|
|
|
|
|
|
|
Подобным образом отражение относительно оси y при x = 0 будет иметь вид
|
|
|
|
[T] = |
|
-1 0 0 1 |
|
|
|
|
|
Отражение относительно прямой y = x осуществляется с помощью матрицы
|
|
|
|
[T] = |
|
0 1 1 0 |
|
|
|
|
|
Выполнив преобразования, получим координаты вершин треугольника D**E**F**
|
|
|
|
|
|
|
|
| |||||||||
|
8 1 7 3 6 2 |
|
|
|
= |
|
1 8 3 7 2 6 |
| |||||||||
|
|
|
|
|
|
|
|
|
Аналогичным образом отражение относительно оси x будет иметь вид
|
|
|
|
[T] = |
|
0 -1 -1 0 |
|
|
|
|
|
Масштабирование
Величина масштабирования определяется значением элементов исходной диагональной матрицы. Если матрица
|
|
|
|
[T] = |
|
2 0 0 2 |
|
|
|
|
|
используется в качестве оператора воздействия на вершины треугольника, то имеет место «двукратное» расширение или равномерное масштабирование относительно точки начала координат. Если значения элементов не равны, то треугольник искажается, что проиллюстрировано на рис.1.5. Треугольник ABC, преобразованный с помощью матрицы
|
|
|
|
[T] = |
|
2 0 0 2 |
|
|
|
|
|
переходит в пропорционально увеличенный треугольник A*B*C*. Тот же треугольник, но преобразованный с помощью матрицы
|
|
|
|
[T] = |
|
1/2 0 0 3 |
|
|
|
|
|
переходит в треугольник DEF, имеющий искажение, вызванное разными коэффициентами масштабирования.
В общем случае при матрице
|
|
|
|
[T] = |
|
a b c d |
|
|
|
|
|
в которой а = d, b = с = 0, выполняется пропорциональное масштабирование; если a <> d, b = с = 0, то масштабирование будет проведено непропорционально. В первом случае для а = d > 1 происходит расширение, т.е. - увеличение изображения. Если а = d < 1, то происходит равномерное сжатие, т.е. фигура уменьшается. Непропорциональное расширение и сжатие возникают в зависимости от значений a и d, которые могут быть меньше либо больше, чем 1, независимо друг от друга.
Перемещения и однородные координаты
В предыдущих разделах был рассмотрен ряд преобразований, совершаемых с помощью (2х2)-матрицы общего преобразования. Среди них поворот, отражение, масштабирование, сдвиг и другие. Ранее отмечалось, что исходная система координат инвариантна по отношению ко всем перечисленным преобразованиям. Однако возникает необходимость изменять положение начала координат, т. е. преобразовывать каждую точку на плоскости. Этого можно достичь путем перемещения точки начала координат или любой другой точки на плоскости
x* = ax + cy + m, y* = bх + dy + n.
К сожалению, нельзя ввести константы перемещения m и n в (2х2)-матрицу преобразования, так как это не пространство!
Данное затруднение можно преодолеть, используя однородные координаты. Однородные координаты неоднородного координатного вектора [x y] представляют собой тройку [x' y' h], где x = x'/h, y = y'/h, а h - некоторое вещественное число. Заметим, что случай h = 0 является особым. Всегда существует один набор однородных координат вида [х у 1]. Мы выбрали эту форму, чтобы представить координатный вектор [х y] на физической плоскости хy. Все остальные однородные координаты представляются в виде [hx hy h]. Данные координаты не сохраняют однозначности, например, все следующие координаты [6 4 2], [12 8 4], [3 2 1] представляют физическую точку (3,2).
Матрица преобразования для однородных координат имеет размер 3х3. В частности,
|
|
|
|
[T] = |
|
a b 0 c d 0 m n 1 |
|
|
|
|
|
где действие элементов а, b, с и d верхней части (2х2)-матрицы точно соответствует действиям, рассмотренным ранее. Элементы m и n являются коэффициентами перемещения в направлениях x и y соответственно. Полная двумерная матрица преобразования имеет вид
|
|
|
|
|
[x* y* 1] = [x y 1] |
|
1 0 0 0 1 0 m n 1 |
|
= [x+m y+n 1] |
|
|
|
|
|
Отметим, что каждая точка плоскости и даже начало координат x = y = 0 теперь могут быть преобразованы.
Пространственные преобразования
Точка в трехмерном пространстве [х y z] представляется четырехмерным вектором
[x' y' z' h] = [x y z 1][T]
где [Т] является матрицей некоего преобразования. Как и ранее, преобразование из однородных координат в обычные задается формулой
|
|
|
|
|
|
|
|
|
|
[x* y* z* 1] = |
|
x'
|
|
y'
|
|
z'
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
Обобщенную матрицу преобразования размерности 4х4 для трехмерных однородных координат можно представить в следующем виде:
|
|
|
|
[T] = |
|
a b с p d e f q g i j r l m n s |
|
|
|
|
|
Матрицу преобразования 4х4 можно разделить на четыре отдельные части. Верхння левая (3x3)-подматрица задает линейное преобразование в форме масштабирования, сдвига, отражения и вращения. Левая нижняя (1х3)-подматрица задает перемещение, а правая верхняя (3х1)-подматрица - перспективное преобразование. Последняя правая нижняя (1х1)-подматрица задает общее масштабирование. Общее преобразование, полученное после применения этой (4 х 4)-матрицы к однородному вектору и вычисления обычных координат, называется билинейным преобразованием. В общем случае данное преобразование осуществляет комбинацию сдвига, локального масштабирования, вращения, отражения, перемещения, перспективного преобразования и общего масштабирования.