Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гладков_Кулютникова.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
1.36 Mб
Скачать

Работа с графикой

Турбо-Паскаль дает возможность выводить на экран рисунки, чертежи, графики функций, диаграммы. Все это называют машинной графикой. В стандарте Паскаля графический вывод не предусмотрен. Но есть мощная графическая библиотека, оформленная в виде модуля Graph, для подключения которого необходимо в начале программы написать:

Uses Graph;

Для вывода графических изображений необходимо перевести экран в графический режим. Графический режим характеризуется:

  • количеством точек (пикселов) по горизонтали и вертикали, светимостью которых можно управлять, обращаясь к ним по координатам. Координата верхнего левого угла - (0,0); координата Х изменяется слева направо, максимальная координата по Х определяется функцией GetMaxX; координата Y изменяется сверху вниз, максимальную координату по Y определяет функция GetMaxY.

  • количеством воспроизводимых на экране цветов (палитра).

Допустимые графические режимы зависят от типа используемого монитора и соответствующего графического драйвера компьютера. Для установки графического режима используется процедура: Procedure InitGraph (Var Driver, Mode: integer; Path: string). Driver определяет тип графического драйвера, Mode - режим работы графического драйвера, Path - путь до файла графического драйвера. Таким образом, для инициации графического режима необходима следующая последовательность операторов:

Uses Graph;

Var Driver, Mode: integer;

Begin

Driver := Detect; {автоматическое определение типа драйвера и установка режима}

InitGraph (Driver, Mode, ‘C:\TP7\BGI’);

.......

CloseGraph; {отмена графического режима и возврат в текстовый режим}

end.

В графическом режиме используются следующие операторы:

Цвет фона SetBkColor (цвет); цвет может иметь значение 07 или

эквивалентное английское название

Цвет рисунка SetColor (цвет); цвет может иметь значение 015.

(соответственно: 0 - Black - черный; 1 - Blue - синий; 2 - Green - зеленый; 3 - Cyan -голубой; 4 - Red - красный; 5 - Magenta - фиолетовый; 6 - Brown - коричневый; 7 - LightGrey - светло-серый; 8 - DarkGrey - темно-серый; 9 - LigthBlue - ярко-голубой; 10 - LigthGreen - ярко-зеленый; 11 - LigthCyan - ярко-голубой; 12 - LigthRed - розовый; 13 - LigthMagenta - малиновый; 14 - Yellow - желтый; 15 - White - белый; 128 - Blink - мерцающий).

Высвечивание точки с координатами Х, Y на экране PutPixel (X, Y, цвет).

Перемещение курсора в точку (Х, Y) MoveTo (X, Y).

Прямая линия между точками (X1, Y1) и (X2, Y2) Line (X1, Y1, X2, Y2).

Прямая линия от текущей точки до точки (X, Y) LineTo (X, Y).

Прямоугольник с верхним левым углом (X1, Y1)

и нижним правым (X2, Y2) Rectangle(X1, Y1, X2, Y2).

Закрашенный прямоугольник с верхним левым

углом (X1, Y1) и нижним правым (X2, Y2) Bar (X1, Y1, X2, Y2).

Установление цвета закраски SetFillStyle (штриховка, цвет).

(штриховка: 0 - цвет фона; 1 - сплошная; 2 - ‘- - - ‘; 3 - ‘///’;

4 -‘///’ утолщенные; 5 - ‘\\\’ утолщенные; 6 - ‘\\\’; 7 - клетка;

8 - косая клетка; 10 - редкие точки; 11 - частые точки).

Закрашивание области FloodFill (X, Y, цвет границы) ,

где X, Y - координаты точки внутри области.

Окружность Circle (X, Y, радиус).

Задача 1. Нарисуйте домик в графическом режиме.

Решение.

{рисование домика}

Uses Graph;

Var Driver, Mode : integer;

begin

{переход в графический режим}

InitGraph (Driver, Mode, ‘C:\TP7\BGI’);

SetBkColor (6); {фон - коричневый}

SetColor (2); {цвет линий - зеленый}

Rectangle (200, 200, 400, 400);

Line (200, 200, 300, 150);

Line (300, 150, 400, 200);

{рисование окна}

Rectangle (250, 250, 350, 350);

Line (250, 280, 350, 280);

line (300, 280, 300, 350);

{рисование солнышка}

SetColor (14); {цвет линий - желтый}

Circle (100, 100, 30);

{рисование лучей}

Line (65, 100, 40, 100);

Line (100, 65, 100, 40);

Line (135, 100, 160, 100);

Line (100, 135, 100, 160);

Line (125, 125, 145, 145);

Line (55, 55, 75, 75);

Line (125, 75, 145, 55);

Line (55 145, 75, 125);

readln;

CloseGraph;

end.

Упражнения.

  1. Нарисуйте домик в символьном режиме, используйте при этом процедуры модуля CRT (GoToXY (x, y) - перемещение курсора в точку с координатами (x, y); TextBackGround (цвет) - цвет фона; TextColor (цвет); ClrScr - очистка экрана).

  2. Нарисуйте в графическом режиме лампочку, которая зажигается и гаснет.

3. Нарисуйте в графическом режиме паровозик.

  1. Измените программу таким образом, чтобы паровозик двигался. Примечание: движение получается, если каждый раз рисовать паровозик на новом месте. При изменении координаты Х с отрицательным шагом паровозик будет двигаться влево, иначе - вправо.

  2. Измените программу так, чтобы паровозик уезжал за пределы экрана и возвращался с другой стороны.

Задача 2. Нарисуйте график функции y = |x - 2| на отрезке - 25 до 25.

Решение. Сначала необходимо начертить оси координат и подписать их. Оси необходимо выбирать таким образом, чтобы они пересекались. Поскольку мы перенесли начало координат в точку пересечения осей и направление оси Y изменилось на противоположное, координаты точек на экране будут определяться следующим образом:

X = X0 + абцисса; Y = Y0 - ордината,

где X0, Y0 - координаты точки пересечения осей X и Y, т.е. центра новой системы координат.

Теперь необходимо выбрать масштаб по осям X и Y. Масштаб показывает какая часть экрана изображает единицу графика. Чтобы задать масштаб необходимо определить размеры экрана, отводимые под график. Для определенности будем считать, что весь экран будет отведен под график, поэтому:

mx = GetMaxX/(Xmax - Xmin + 1) = GetMaxX/(25 - (-25) + 1).

Для оси Y необходимо определить Ymax и Ymin (соответственно |-25 -2| = 27 и 0). Весь график будет выше оси X. Будем использовать для изображения отрезка [0; 27] GetMaxY div 2 точек, поэтому my := GetMaxY div 2/ 30.

Затем необходимо нанести единицы измерения на оси, ось Х разметим с шагом 5, ось Y - с шагом 1.

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

Uses Graph;

var driver, mode: integer; {для инициализации графического режима}

x0, y0: integer; { координаты центра}

x, y, i: integer; { координаты текущей точки

i - счетчик циклов}

mx, my: real; {масштабы}

s: string; {для разметки осей}

begin

driver := detect;

InitGraph (driver, mode, ‘C:\TP7\BGI’);

SetBkColor (7); SetColor(1);

x0 := GetMaxX div 2;

y0 := GetMaxY div 2;

{рисуем оси координат}

{ось X}

line (0, y0, GetMaxX, y0); line (GetMaxX, y0, GetMaxX - 10, y0 -10); {прорисовка}

line (GetMaxX, y0, GetMaxX - 10, y0 +10); {}

OutTextXY (GetMaxX - 10, y0 - 15, ‘X’);

{ось Y}

line (x0, 0, x0, GetMaxY); line (x0, 0, x0 - 10, 10); {прорисовка}

line (x0, 0, x0 + 10, 10); {}

OutTextXY (x0 - 20, 5, ‘Y’);

mx := GetMaxX/(25 - (-25 + 2)); my := GetMaxY div 2/30;

{нанесение единиц измерения на оси}

for i := -25 to 25 do

begin x := x0 + round (i * mx);

if i mod 5 = 0 then begin line (x, y0 - 2, x, y0 + 2);

str (i, s); OutTextXY (x + 4, y0 + 2, s)

end;

end;

for i := -30 to 30 do

begin y := y0 - round (i * my);

if i mod 5 = 0 then begin line (x0 - 2, y, x0 +2, y);

str (i, s); OutTextXY (x0 + 4, y, s)

end;

end;

{вывод графика}

x := x0 + round (-25 * mx);

y := y0 - round (30 * my);

MoveTo (x, y);

for i := - 24 to 25 do

begin x := x0 + round (i * mx);

y := y0 + round (abs(i - 2) * my);

end;

OutTextXY (x0 + 50, y0 + 200, ‘график функции y = |x-2|’);

readln;

CloseGraph;

end.

Упражнения.

  1. Напишите программу вывода графика функции y = x - 2на участке - 25 до 25 в символьном режиме.

  2. Напишите программу вывода в графическом режиме графика функции y = a + sin (x - b) на отрезке - 10 до 15.

Задача 3. Выведите на экран орнамент. Повторяющийся фрагмент выделен пунктиром. Прорисовка этого фрагмента будет оформлена в виде процедуры. В качестве параметров используются координаты верхнего левого угла.

Uses Graph;

var driver, mode: integer;

x, y : interger;

procedure cadr (x, y: integer);

begin

rectangle (x + 10, y + 10, x + 30, y + 30);

line (x, y, x + 10, y + 10); line (x + 40, y, x + 30, y + 10);

line (x, y + 40, x + 10, y + 30); line (x + 40, y + 40, x + 30, y + 30);

end;

begin {тело основной программы}

driver := detect;

InitGraph (driver, mode, ‘C:\TP7\BGI’);

x := 0;

while x <= GetMaxX do

begin

y := 0;

while y <= GetMaxY do

begin

cadr (x, y); y := y + 40

end;

x := x + 40;

end;

readln;

CloseGraph;

end.

Упражнения.

  1. Внести такие дополнения в программу, чтобы:

  • узор был цветным;

  • у каждой строки узора был свой цвет;

  • цвет менялся от фрагмента к фрагменту.

  1. В примере 3 повторение фрагмента осуществляется сначала по горизонтали, затем по вертикали. Измените программу так, чтобы узор выводился сначала по вертикали, а затем по горизонтали.

  2. Измените шаг узора по вертикали и горизонтали.

  3. Почему настройка на графический режим сделана в основной программе, а не в процедуре? Как будет работать программа, если сделать настройку в процедуре?

  4. Напишите процедуру рисования елочки. Используя эту процедуру, нарисуйте еловый лес.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]