Книжка Хабы (970988), страница 12
Текст из файла (страница 12)
1. Демонстрационный пример
Пример 9.1: Изобразить движение солнца на голубом небе в горизонтальной плоскости.
Program MySun;
Uses Crt, Graph;
Var driver, mode, i: integer;
Begin
Clrscr;
Driver := detect;
Initgraph (driver, mode, ‘’);
I :=0;
while i<=750 do
begin
SetColor(14); {задает цвет будущего изображения}
SetBkColor(3); {задает цвет фона}
SetFillStyle(1,14); {задает способ заполнения замкнутой области}
Circle(i,100,50); {рисует окружность R=50, с центром i и 100}
FloodFill(i,100,14); {заполняет замкнутую область, в которой находится точка i , 100}
Delay (200); {в течение 200 единиц}
SetFillStyle(1,3); {1 –сплошное заполнение, 3 – цвет голубой}
SetColor(3);
Circle(i,100,50);
FloodFill(i,100,3);
i := i +5
end;
Readln;
End.
2. Задачи, для самостоятельного решения
Задача 1. Изобразить, окружность диаметром d, перемещающуюся по вертикали через центр экрана.
Задача 2. Изобразить квадрат, со стороной а, перемещающийся по горизонтали на расстоянии 100 точек от начала координат.
Задача 3. Изобразить прямоугольник с основанием L и высотой H, перемещающийся по главной диагонали экрана.
Задача 4. Изобразить окружность радиуса R, перемещающуюся по синусоиде с амплитудой не более 100 пикселей.
Задача 5. Изобразить на экране гармонические колебания точки вдоль некоторого горизонтального отрезка. Если длина отрезка равна С, то расстояние от точки до левого конца в момент времени t можно считать равным: C ( 1 + cos(α t )) / 2 , где: α - частота колебаний.
Задача 6. Построить правильный пятиугольник, вписанный в окружность с координатами центра х1,у1 и радиусом R. Через 10 секунд повернуть его на 4/.
Задача 7. Окружность радиуса R перемещается на экране справа налево, по достижении ею середины экрана слева направо начинает перемещаться по синусоиде длиной L.
Задача 8. Изобразить перемещение окружности по спирали из центра экрана по n виткам и внешнему радиусу R. Начальное направление спирали образует с осью ОХ угол t и задано уравнениями: х = R cos t, y = R sin t, шаг 2.
Задача 9. Изобразить на экране часы с часовой и минутной стрелками, вращающимися в одном направлении.
Задача 10. Проиллюстрировать законы Кеплера, согласно которым планеты движутся по эллипсам, в одном из фокусов которых находится солнце. Параметрические уравнения для траектории движения по эллипсу: х = R1 cos t, y = R2 sin t, в интервале [0, 2].
Задача 11. Изобразить движение шарика по синусоиде.
Задача 12. Изобразить треугольник, вращающийся вокруг точки пересечения его высот.
Задача 13. Изобразить на экране движение бильярдного шара без луз.
Задача 14. Построить на экране синусоиду. Не менее 10 раз изменить ее цвет.
Задача 15. Построить модель атомного ядра, бомбардируемого α-частицами. В центре экрана – ядро с вращающимся вокруг него тремя электронами. Параметрические уравнения для одного электрона таковы: х = R cos t, y = R sin t, в интервале [0, 2]. Из одного из углов экрана появляется α-частица в направлении ядра, для которой координата по оси ОУ моделируется датчиком случайных чисел. В случае столкновения с ядром или с одним из электронов происходит взрыв.
Задача 16. Разработать программу, которая демонстрирует на экране движение квадрата: квадрат улетает от нас (центра экрана) к некоторой точке горизонта, одновременно вращаясь вокруг свой оси. Раскрасить квадрат по диагоналям.
Задача 17. Разработать программу, обеспечивающую вывод «бегущей » строки с текстовой информацией «Внимание! Просим всех посетить нашу выставку достижении науки и техники! ». Окошко высвечивает до 10 символов/букв.
Задача 18. Создать программу, заполняющую экран в виде множества отрезков различной длины и цвета, исходящих из центра экрана и вращающихся против часовой стрелки.
Лабораторная работа №10
Масштабирование, поворот, управление объектами
Цель работы – овладение практическими приемами разработки программ, приобрести навыки в управлении режимами отображения объектов в графическом режиме.
-
Теоретическая часть
1.1. Преобразование изображений: перенос,
масштабирование, поворот, комбинированные преобразования
При построении изображений часто приходится иметь дело с ситуациями, когда общее изображение (рисунок) включает в себя целый ряд компонент (подрисунков), отличающихся друг от друга только местоположением, ориентацией, масштабом, т.е. отдельные подрисунки обладают значительным геометрическим сходством.
В этом случае целесообразно описать один подрисунок в качестве базового, а затем получать остальные требуемые подрисунки путем использования операций преобразования.
С помощью операций преобразования можно выполнять следующие действия:
1) перемещать рисунки из одного места экрана в другое;
-
создавать рисунок из более мелких элементов (составных частей);
-
добавлять к существующему рисунку новые элементы;
-
увеличивать размер рисунка для улучшения его наглядности или отображения более мелких деталей;
-
уменьшать размер рисунка для внесения, например, поясняющих надписей или отображения на экране новых рисунков;
-
создавать движущиеся изображения.
Все изменения рисунков можно выполнить с помощью трех базовых операций:
1) переноса (перемещения) изображения;
2) масштабирования (увеличения или уменьшения размеров) изображения;
3) поворота изображения (употребляют также термины вращение, изменение ориентации).
Для реализации перечисленных операций используется аппарат линейных преобразований.
Линейное преобразование на плоскости - это такое отображение плоскости в себя, при котором прямая переходит в прямую. Произвольная точка с координатами (X,Y) переходит в результате линейного преобразования в точку с координатами (X1,Y1) в соответствии с выражениями:
X1 = A*X + B*Y + C
Y1 = D*X + E*Y + F, (1)
где A,B,C,D,E,F - коэффициенты данного преобразования, однозначно его определяющие.
Последовательное применение двух линейных преобразований можно заменить одним третьим, эквивалентным, которое называется их произведением.
Формулы линейного преобразования (1) можно записать в матричной форме:
¦ A D 0¦
(X1,Y1,1) = (X,Y,1) * ¦B E 0 ¦ = (X,Y,1) * M, (2)
¦ C F 1 ¦
где M матрица преобразования.
Здесь используются однородные координаты, которые были введены в геометрии и ныне широко используются в машинной графике. В однородных координатах точка P(X,Y) записывается в виде P(W*X,W*Y,W) для любого масштабного множителя W<>0. При этом, если для точки задано ее представление в однородных координатах P(X,Y,W), то можно найти ее двумерные декартовы координаты как x=X/W, y=Y/W. Для двумерного пространства W=1, поэтому операция деления не требуется. Однородные координаты можно представить как вложение промасштабированное с коэффициентом W двумерной плоскости в плоскость z=W (здесь z=1) в трехмерном пространстве.
Следует добавить, что с помощью матрицы преобразования
¦ A B ¦
(X1,Y1)=(X,Y)*¦ C D ¦ , - нельзя описать операцию переноса.
Для двух последовательно выполняемых линейных преобразований можно записать следующее выражение:
(X2,Y2,1) = (X1,Y1,1)*M2 = (X,Y,1)*M1*M2 = (X,Y,1)*M (3)
где X,Y - координаты исходной точки;
X1,Y1 - координаты точки после первого преобразования;
X2,Y2 - координаты точки после второго преобразования;
M1,M2,M - матрицы соответственно первого, второго и результирующего преобразований.
Поскольку в общем случае операция умножения матриц не является коммутативной, то в общем случае и два последовательных линейных преобразования некоммутативные.
Если определитель матрицы преобразования отличен от нуля, то такое преобразование будет являться аффинным. При аффинном преобразовании плоскость не может вырождаться в линию или точку, параллельные прямые переводятся в параллельные и всегда имеется обратное преобразование.
Аффинное преобразование может быть представлено суперпозицией трех преобразований: переноса, масштабирования, поворота.
1.2. Перенос изображения
Перенос изображения заключается в перемещении отображенного объекта из одного места экрана в другое место. Перенос изображения позволяет построить рисунок в произвольном месте экрана и затем перенести его в другую, требуемую, часть экрана. При этом можно изменить компоновку рисунка или создать единый рисунок из набора готовых элементов.
Для переноса точки из позиции с координатами (X,Y) в позицию с координатами (X1,Y1) надо к координате X добавить DX, а к координате Y - DY единиц, причем DX = X1 - X, DY = Y1 - Y.
Матрица преобразования M для операции переноса имеет следующий вид:
¦ 1 0 0 ¦
M = ¦ 0 1 0 ¦ (4)
¦ DX DY 1 ¦
При подстановке ее в выражение (2), получим
¦ 1 0 0 ¦
(X1,Y1,1) = (X,Y,1) * ¦ 0 1 0 ¦ или
¦ DX DY 1 ¦
X1 = X+DX, Y1 = Y+DY.
Положительное значение DX означает перемещение точки вправо по горизонтали, отрицательное - влево; положительное значение DY - перемещение вниз по вертикали, отрицательное - вверх.
Необходимо задавать такие значения DX, DY, чтобы после преобразования точка оставалась в пределах экрана, иначе она высвечиваться не будет. Не следует задавать слишком малые значения DX, DY (DX < 0,5, DY < 0,5), так как в этом случае точка повторно высвечивается на старом месте.
Перенос рисунка из одной области экрана в другую эквивалентен переносу всех точек рисунка и последующему высвечиванию соединяющих их линий. Для исключения искажения рисунка все точки необходимо переместить на одинаковое расстояние, т.е. использовать одну и ту же матрицу преобразования.
Для фигур, обладающих симметрией, или с границами, вычисляемыми с помощью уравнений, при переносе изображения нет необходимости добавлять смещение к координатам всех точек.
Например, для переноса окружности достаточно перенести ее центр и вычертить ее, зная радиус. Таким же образом осуществляется перенос эллипса.
1.3. Масштабирование изображения
При создании изображения на экране дисплея может возникнуть необходимость изменения его размеров с целью повышения его наглядности, для вставки созданного изображения в уже имеющийся рисунок. Размер рисунка можно изменить, если умножить все расстояния между точками на некоторую постоянную величину (коэффициент масштабирования). Если коэффициент масштабирования больше единицы, то рисунок увеличивается, если меньше единицы - уменьшается.
Наряду с коэффициентом масштабирования для выполнения масштабирования надо указать новое положение рисунка (после выполнения масштабирования). Новое положение рисунка определяется центром масштабирования - некоторой центральной точкой, относительно которой выполняется масштабирование.
В качестве такой точки может быть выбрана центральная точка рисунка, точка, лежащая на границе рисунка, точка, лежащая вне рисунка и даже вне экрана.
Масштабирование может быть однородным (коэффициенты масштабирования вдоль осей абсцисс и ординат одинаковы), в этом случае пропорции рисунка сохраняются.
Масштабирование может быть и неоднородным (коэффициенты вдоль осей абсцисс и ординат различны), в этом случае пропорции рисунка изменяются.
Неоднородное масштабирование может применяться при подборе пропорций рисунка, в процессе конструирования и проектирования при подборе размеров объекта.
Матрица преобразования при масштабировании имеет вид
¦ KX 0 0 ¦