Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_po_paskalju.doc
Скачиваний:
4
Добавлен:
04.11.2018
Размер:
391.68 Кб
Скачать

Графика.

Стандартные модули.

Стандартный модуль содержит процедуры и другие элементы, которые загружаются с диска в память только тогда, когда программист специально попросит об этом.

Модуль СRТ занимается звуком.

Модуль Graph позволяет работать с изображениями на экране.

Чтобы использовать в программе тот или иной стандартный модуль, нужно записать первой строкой своей программы: USES <имя модуля> (читается "юзез", переводится – "использует").

Mодуль Graph.

(читается – "граф", переводится – "графика")

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

Текстовый и графический режимы.

Существуют два режима работы компьютера с монитором – текстовый и графический. В любом месте программы можно переключиться из одного режима в другой.

Текстовый режим используется для вывода на экран текстовой и числовой информации. Работая в текстовом режиме, компьютер считает экран разбитым на 25 строк и 80 столбцов. В каждой из получившихся клеточек умещается ровно один символ. Рисовать в текстовом режиме компьютер не может.

Работая в графическом режиме, компьютер считает экран разбитым на 640 столбцов и 480 строк. Каждая из получившихся клеточек называется пикселем. Изображение на экране создается из пикселей. Каждый пиксель по указанию программы может быть потухшим или гореть заданным цветом.

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

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

Перед использованием процедуры InitGraph необходимо создать две переменные величины типа Integer с произвольными именами (Device,Mode).

Обе эти переменные при обращении к процедуре InitGraph должны быть записаны внутри круглых скобок. ( Device – это тип видеоадаптера, Mode – номер графического режима. Если написать Device:=0, то Паскаль сам определит тип видеоадаптера и установит самый мощный из допустимых графический режим.)

Пример. Программа, рисующая окружность.

USES Graph;

VAR Device,Mode:Integer;

BEGIN

Device:=0;

InitGraph(Device,Mode,'a:\TP\BGI');

Circle(100,80,50);

ReadLn;

CloseGraph

END.

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

Замечание

При переключении режимов всё содержимое экрана стирается.

Рисование простейших фигур.

В компьютере применяется такая система координат:

x

y

Отличия графической системы координат от декартовой:

  • Графические координаты принимают только целочисленные значения.

  • Графические координаты принимают значения, ограниченные как снизу (нулевым значением), так и сверху (значением разрешения).

  • Графическая координата отсчитывается сверху вниз.

п\п

название фигуры

процедура

назначение процедуры

1

точка

PutPixel(x,y,color)

закрашивает точку с графическими координатами (x,y) цветом color. Цвет можно указывать как числом, так и предопределённой константой. (См. таблицу цветов.)

2

отрезок прямой линии

Line(x1,y1,x2,y2)

рисует отрезок прямой линии, проведенной между точками с графическими координатами (x1,y1)и (x2,y2).

3

прямоугольник

Rectangle(x1,y1,x2,y2)

рисует прямоугольник с координатами левого верхнего угла (x1,y1) и правого нижнего (x2,y2).

4

залитый прямоугольник

Bar (x1,y1,x2,y2)

рисует залитый прямоугольник текущим цветом и закрашивает его в соответствии с установленным при обращении к SetFillStyle стилем.

5

окружность

Circle(x,y,R)

рисует окружность с центром в точке (x,y) радиусом R.

6

дуга окружности

Arc(x,y,beg,end,R)

рисует дугу с центром окружности дуги в точке (x,y). Параметры beg и end – это начальный и конечный углы, отсчитываемые от горизонтальной оси против часовой стрелки в градусах, R – радиус окружности.

7

залитый сектор круга

PieSlice(x,y,beg,end,R)

рисует залитый сектор круга текущим цветом.

8

эллипс

Ellipse(x,y,f1,f2,rx,ry)

рисует эллипс центром в точке (x,y), где f1 и f2 – начальный и конечный углы части эллипса, отсчитываемые от горизонтальной оси против часовой стрелки в градусах, rx и ry – радиусы эллипса.

9

залитый сектор эллипса

Sector(x,y,f1,f2,rx,ry)

рисует залитый сектор эллипса текущим цветом.

10

залитый эллипс

FillEllips(x,y,f1,f2,rx,ry)

рисует залитый эллипс текущим цветом.

Работа с цветом. Заливка. Стиль линий и заливки.

Замечание.

По умолчанию все фигуры рисуются тонкими белыми линиями.

Процедура SetLineStyle.

Процедура SetLineStyle(style,0,thickness) устанавливает стиль рисуемых линий.

стиль линии

значение аргумента style

сплошная

SolidLn

пунктирная

DottedLn

штрихпунктирная

CenterLn

штриховая

DashedLn

стиль линии

значение аргумента thickness

нормальная толщина

1

толстая линия

3

Замечание.

Второй аргумент используется при задании своего стиля линии.

Процедура SetColor.

Процедура SetColor(color) устанавливает цвет рисуемых линий.

цвет

значение аргумента color

код

Чёрный

Black

0

Синий

Blue

1

Зелёный

Green

2

Бирюзовый

Cyan

3

Красный

Red

4

Розовый

Magenta

5

Коричневый

Brown

6

Светло-серый

LightGray

7

Тёмно-серый

DarkGray

8

Светло-синий

LightBlue

9

Светло-зелёный

Light Green

10

Светло-бирюзовый

Light Cyan

11

Светло-красный

Light Red

12

Светло-розовый

Light Magenta

13

Жёлтый

Yellow

14

Белый

White

15

Процедура SetFillStyle.

Процедура SetFillStyle(style,color) устанавливает цвет и стиль заливки.

стиль заливки

значение аргумента style

код

Сплошное заполнение цветом фона

EmptyFill

0

Сплошное заполнение заданным цветом

SolidFill

1

Заполнение горизонтальными линиями

LineFill

2

Диагональное заполнение ( /// )

LtSlashFill

3

Диагональное заполнение толстыми линиями

SlashFill

4

Обратное диагональное заполнение толстыми линиями

BkSlashFill

5

Обратное диагональное заполнение ( \\\ )

LtBkSlashFill

6

Клетчатое заполнение

HatchFill

7

Косое клетчатое заполнение

XhatchFill

8

Чередующееся линейное заполнение

InterleaveFill

9

Редко расположенные точки

WideDotFill

10

Часто расположенные точки

CloseDotFill

11

Стиль определён пользователем

UserFill

12

Замечание.

В обращениях к процедурам SetColor и SetFillStyle вместо английских названий цвета и стиля заливки можно использовать соответствующие коды.

Процедура FloodFill.

Процедура FloodFill(x,y,color) закрашивает область, внутри которой находится точка с координатами (x,y). Закрашиваемая область должна быть ограничена замкнутой линией цвета color.

Замечание.

Распространённая ошибка – на вопрос о том, каким цветом будет красить оператор FloodFill(100,200,0), отвечают: "Чёрным", хотя нужно отвечать: "Не знаю, надо посмотреть в SetFillStyle".

Задача.

Нарисовать жёлтый квадрат и закрасить его горизонтальными линиями красного цвета.

Программа.

USES Graph;

VAR Device,Mode:Integer;

BEGIN

Device:=0;

InitGraph(Device,Mode,'a:\TP\BGI');

SetColor(14);

SetFillStyle(2,4);

Rectangle(200,50,300,150);

FloodFill(250,100,14);

ReadLn;

CloseGraph

END.

Использование в рисовании переменных величин.

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

Задача 12.

Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами центра: 50, 80, 110, 140,…, 290.

Программа.

USES Graph;

VAR Device,Mode,x:Integer;

BEGIN

Device:=0;

InitGraph(Device,Mode,'a:\TP\BGI');

x:=50;

Repeat

Circle(x,100,10);

x:=x+30;

Until x>290;

ReadLn;

CloseGraph

END.

Задачи:

1. Нарисовать ряд точек по направлению из левого нижнего угла, в правый верхний.

2. Нарисовать "Круги на воде", т.е. нарисовать 20 концентрических окружностей,

т.е. окружностей разного радиуса, но имеющих общий центр.

3. Разлиновать экран в линейку.

4. Разлиновать экран в клетку.

Использование случайных величин при рисовании.

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

Задача.

Нарисовать "звёздное небо", т.е. в случайных местах экрана нарисовать 1000 разноцветных точек.

Фрагмент программы:

For i:=1 to 1000 do PutPixel (Random(640),Random(480),Random(16));

Задачи:

  1. Нарисовать "дождь в луже", т.е. заполнить экран окружностями радиуса 20 в случайных местах.

  2. Нарисовать "мыльные пузыри", т.е. заполнить экран окружностями случайных радиусов и цветов в случайных местах.

  3. Нарисовать "звёзды в окне", т.е. изобразить звёздное небо в пределах прямоугольника.

Движение картинок по экрану.

Рассмотрим иллюзию движения, возникающую на экране кинотеатра.

Если внимательно посмотреть на киноплёнку фильма, изображающего, скажем, движение

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

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

Задача.

Написать программу движения по экрану слева направо окружности.

Программа.

Сначала нарисуем слева окружность и тут же сотрём её, для чего нарисуем её на том же месте, но чёрным цветом. Несмотря на то, что окружность тут же сотрём, она успеет мелькнуть на экране и глаз это заметит. Затем надо нарисовать и стереть такую же окружность чуть правее, затем ещё правее, и т.д. Так как в цикле окружность последний раз стирается, т.е. рисуется чёрным цветом, то после цикла необходимо её еще раз нарисовать белым цветом.

USES Graph;

VAR Device,Mode,x:Integer;

BEGIN

Device:=0;

InitGraph(Device,Mode,'a:\TP\BGI');

x:=40;

Repeat

SetColor(15);

Circle(x,100,10); {рисуем белую окружность}

SetColor(0);

Circle(x,100,10); {рисуем чёрную окружность}

x:=x+1;

Until x>600;

SetColor(15);

Circle(x,100,10); {рисуем последний раз белую окружность}

ReadLn;

CloseGraph

END.

Замечание.

Изменить скорость движения можно, увеличив или уменьшив шаг движения. Если фигуры рисовать толстой линией, то движение сильно замедлится, так как толстая линия рисуется гораздо дольше тонкой, то же относится и к закрашенной окружности. Замедлить движение можно и с помощью оператора Delay, введя её между рисованием и стиранием фигуры.

Задачи:

  1. Нарисовать две окружности, которые движутся слева направо.

  2. Нарисовать две окружности, одна из которых движется вниз, а другая – направо.

  3. Нарисовать окружность, которая бесконечно движется, отскакивая от правого и левого края экрана.

  4. Нарисовать кораблик, плывущий по реке.

МАССИВЫ

I. Переменные с индексами.

Поскольку в алфавите Паскаля нет подстрочных букв и цифр, то индексированные переменные на Паскале обозначаются так:

x [1], y [I], z [I, j].

Рассмотрим бесконечный ряд чисел Фибоначчи: 1 1 2 3 5 8 13 21 34 … Каждое из чисел Фибоначчи обозначается индексированной переменной таким образом:

f [1] =1 f [2] =1 f [3] =2 f [4] =3 f [5] =5 …

В этом ряду каждое из чисел является суммой двух предыдущих. В индексном виде это записывается так:

f [1] = f [I-2] + f [I-1].

Задача.

Запишите в индексном виде, как получается из предыдущего числа ряда последующее:

а) 14 18 22 26 … f [I] = f [I-1] + 4

б) 6 12 24 48 … f [I] = f [I-1] * 2

в) 3 5 9 17 33 65 … f [I] = 2 * f [I-1] – 1

II. Определение массива.

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

Номер элемента массива назначается его индексом, причем индексов может быть несколько. Массив с одним индексом называют одномерным массивом, с двумя – двумерным и т.д.

Если в программе используется массив, его следует описать в разделе описаний программы.

III. Одномерные массивы.

Описание одномерного массива имеет вид:

VAR имя_массива: array [нач_инд .. кон_инд] of тип_данных;

Здесь имя_массива выбирается в соответствии с обычными привилами Раскаля. Array – читается "эррэй"; переводится "массив" – зарезервированное слово, указывающее, что имя относится к массиву. Нач_инд и кон_инд – это целые числа, определяющие диапазон изменения индексов элементов массива:

VAR temp: array [1..31] of Real;

Нумерация массива не обязательно начинается с 1, но нижняя граница должна быть меньше верхней. Количество элементов в массиве можно найти по формуле: кон_инд – нач_инд + 1.

Так, например, массив VAR sum: array [6..8] of Integer; состоит всего из трех элементов 8 – 6 + 1=3.

Обратимся к элементу массива как к обычной переменной можно, указав имя массива и индекс элемента в квадратных скобках [ ] . С элементами массива можно выполнять все операции, которые допускаются его типом.

Пример задания одномерного массива:

1 способ (примитивное присваивание VAR a : array [1..4]\ of integer;

BEGIN

a [1] : = 8; a [2] : = 9; a [3] : = - 35; a [4] : = 2;

2 способ (с помощью клавиатуры)

const n = 10;

VAR a: array [1..n] of integer; I : integer;

BEGIN

For I :1 to n do begin

writeln (' Введите a [' , I , '] ');

Readhn (a [I]);

end; for

Задача.

Дана таблица чисел. Найти сумму положительных элементов.

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