Для построения изображения на экране дисплея используется специальная библиотека подпрограмм, называемая Graph. В нее входят графические процедуры и функции для выдачи различных по форме фигур и линий, а также средства организации графического режима. Эти средства предназначены для анализа возможностей используемого дисплея — разбиения поля экрана на различное число мелких квадратиков, каждый из которых считается отдельной точкой изображения и называется пикселем. Для дисплея типа VGA число точек может быть 640 * 480, а количество используемых цветов — 16. Однако более сложные, не рассматриваемые здесь средства Паскаля позволяют увеличить количество цветов до 256. Цвет, как и координаты экранной точки, задается целым числом. Начало координат экрана находится в левом верхнем углу (точка 0,0), ось Ох направлена вправо, Оу — вниз (рис.9).
Рис. 9. Система координат экрана дисплея
Эту особенность направленности оси Оу следует учитывать при построении изображений, особенно графиков функций и диаграмм. Для построенной
Рис. 10.
Установление соответствия между точками отрезка [а, b] и осью Ох экрана дисплея
на рисунке 9 окружности необходимо отмечать координаты центра и радиус, для прямоугольника — координаты противоположных вершин (например, А и D). Координаты точки А (180, 160) заданы на рисунке. Каждое изображение можно также построить по точкам, указав для каждой точки ее координаты и цвет.
При построении изображений используются так называемые графические примитивы — базовые конструкции и их модификации. К графическим примитивам относятся: точка, отрезок, дуга.
Точка. Для выдачи точки на экран используется вызов процедуры
PutPixel (x, у, номер_цвета); где x, у — координаты точки.
С помощью этого оператора можно построить график функции.
Построение графика функции. Чтобы построить график, необходимо сначала задать отрезок области определения, на котором функция существует, и отобразить этот отрезок на ось Ох экрана дисплея. Точке х отрезка [а, b] из области определения функции должна соответствовать точка х экрана дисплея, а точке у = f(x) — значению функции — точка у1 экрана (рис. 10). Таким образом происходит масштабирование графика, что дает возможность отображать на экран любой отрезок области определения. Здесь, безусловно, надо учитывать разрешающую возможность экрана, чтобы масштаб позволил увидеть качественное поведение функции. Точки на экране, в отличие от точек геометрической прямой, имеют дискретные значения. Точки оси Ох нумеруются от 0 до 640, т. е. х1 = 0, 1,2,3, ...,640.
Из пропорции (х — а) / (b — а) = (х1 — 0) / (640 — 0) получим расчетную формулу вычисления аргумента функции, соответствующего заданной точке экрана: х = а + х1 * (b - а) / xmax
где хтax = 640, если дисплей типа VGA. Для найденного значения аргумента вычисляется значение функции: y=f(x)
Теперь необходимо умножить полученное значение функции на коэффициент масштабирования, показывающий, сколько пикселов (физических точек экрана) содержится в выбранной единице масштаба: k = xmax / (b - а)
Получаем значение у — координату для выдачи рассчитанной точки графика функции на экран: у1 = у * xmax / (b - а)
Теперь следует учесть особенность расположения оси Оу на экране и перевернуть график, предполагающий традиционное положение осей координат, а так- же добавить смещение, чтобы график располагался по центру экрана:
у1 = уmax / 2 - у1
С координатами х1 и у1 точка выводится на экран. Поскольку реальные координаты графика функции, по которым она вычисляется, вещественные числа, а координаты точек экрана — целые, то результат, полученный при использовании в программе формулы для вычисления у1, необходимо округлить до ближайшего целого числа. Округление производит функцияtrunc. аргумент которой — выражение вещественного типа: у1: = trunc (у * xmax / (b - а)).
Программа построения графических изображений должна начинаться с оператора подключения библиотеки графических процедур и специальной библиотеки, позволяющей использовать функции операционной системы (библиотеки Crt). Этот оператор располагается сразу за заголовком программы и имеет вид: uses Graph, Crt;
Сама программа состоит из описаний процедур построения изображений, описания функции, для которой строится график, и описания специальной процедуры установки графического режима. Главная программа при этом содержит операторы вызова этих процедур и оператор задержки изображения на экране (после построения последней точки изображение исчезает):
repeat until keypressed;{выполнять пустой цикл до нажатия любой клавиши}
Программа построения графика функции у = sin (х) на отрезке [—p, p]:
programР33;
usesGraph, Crt;
procedureInit; {установка графического режима}
vargr, gm:Integer;
Begin
gr: = 0; {автоматическое распознавание типа дисплея}
InitGraph (gr, gm, ‘ ‘); {файл egavga.bgi находится в одном каталоге с turbo.ехе}
if GraphResult <> grOk thenHalt (1); {обработка результата установки}
end;
functionf (х: real):real;{вычисление функции f (х)}
Begin
f: = sin (х)
end;
proceduregrafic;
varxmax, ymax, х1, у1:integer;х, y, a, Ь:real;
Begin
xmax: = 640; ymax: = 480; a: = - 3.14; b: = 3.14;
for х1: = 0 toxmax do
Begin
х: = a + х1 * (b - a) / xmax;
y: = f (х); {вызов подпрограммы-функции}
у1: = trunc (y * xmax / (b - a));
у1: = ymax div 2 - у1;
PutPixel (х1, у1, 2); {выдача точки зеленым цветом}
End
end;
begin{главная программа}
Init; {вызов процедуры установки графического режима}
При построении сложных рисунков, выдаваемых по точкам, можно использовать прием мозаики: нарисовать рисунок по клеточкам и заполнить таблицу целых чисел, при этом каждое число соответствует номеру цвета определенной клеточки, а координаты клеточки соответствуют индексам элементов таблицы (рис. 11).
Задание цвета. Некоторые графические операторы, такие, как построение точки, включают в себя параметр цвета, но во многих других используется текущий цвет, определенный последним оператором задания цвета:
SetColor (цвет);
На рисунке 12 приведена таблица цветов, где каждый цвет может быть задан как номером, так и словом (на английском).
Отрезок. Для построения отрезка необходимо указать координаты его концов. Отрезок строится текущим цветом. Оператор построения отрезка:
Line(x1,y1,x2,y2);
При построении изображения компьютер как бы рисует лучом. Луч останавливается в последней точке изображения, координаты которой
черный
синий
зеленый
Бирюзовый
красный
малиновый
коричневый
серый-с
серый-т
голубой
зеленый-с
Бирюзовый-с
красный-с
малиновый-с
желтый
Белый
Рис. 12. Номера цветов (с-- светлый, т — темный)
запоминаются. Можно построить отрезок, указав либо смещение от этой точки по осям х и у, либо координаты конца отрезка (начало там, где остановился луч). Смещение задается в виде целого числа, причем положительное означает увеличение последней координаты на величину смещения, отрицательное — соответственное уменьшение координаты. Смещение удобно использовать для построения изображения в относительных координатах, когда достаточно указать координаты первой точки, а остальные будут пересчитаны. Таким образом можно перемещать картинку по экрану.
Оператор построения отрезка с указанием смещения: LineRel (dx, dy);
Оператор построения отрезка с указанием последней его точки: LineTo (x, у);
Последний оператор удобен для построения графика функции, которая либо резко возрастает, либо резко убывает. В этом случае изображение, построенное по точкам, терпит разрыв, так как для двух соседних аргументов два значения функции находятся далеко друг от друга. Первую точку графика надо выдать операторомPut Pixel, а остальные, вычисляемые и строящиеся в цикле, — операторомLineTo.
Луч, строящий изображения, может перемещаться без следа. Это позволяют делать операторы, аналогичные двум последним:
MoveRel (dx, dy);
MoveTo (x, у);
Прямоугольник строится подобно отрезку: необходимо указать координаты концов любой диагонали. Прямоугольник может быть построен в виде контура или в виде закрашенной фигуры. Для контурного изображения - оператор Rectangle (x1, у1, х2, у2);для закрашенного Ваг(х1,у1,х2,у2);
Построение столбчатой диаграммы. На рисунке 13 представлена столбчатая (линейная) диаграмма падения успеваемости некоторого учащегося по четвертям учебного года. В первой четверти успеваемость составила 75%, во второй — 50%, в третьей — 25%. Построим такую диаграмму с помощью программы, расположив самый высокий столбец в центральной части экрана
(его длина — 480 : 3 = 160 пикселов) и рассчитав остальные пропорционально их значениям относительно этого размера. По ширине вся диаграмма занимает также 1/3 часть, т. е. первоначальное значение координаты х равно 210 пикселов, ширина столбцов по 35 и расстояние между ними также 35 пикселов. Для расчета высоты второго столбца составим пропорцию 75 : 50 = 160 : х. Отсюда х = 106 (с округлением до целого). Высота третьего столбца 53 пик-
села. Поскольку нижние основания прямоугольников находятся на одно! уровне, для которого у = 320, расчет вторых координат (п оси у) производится вычитанием из 320 высоты соответствующего столбца.
Размещение текста на изображении производится с по мощью оператора:
OutTextXY (х, у, ‘текст’);
где х, у — координаты, начиная с которых будет выдан текст.
Программа построения столбчатой диаграммы имеет такую же структуру, как и программа РЗЗ.
program Р34;
uses Graph, Crt;
procedure Init; {установка графического режима}
var gr, gm:integer;
Begin
gr: = 0; {автоматическое распознавание типа дисплея}
InitGraph (gr, gm, ‘ ‘); {файл egavga.bgi находится в одном каталоге с turbo.ехе}
if GraphResult <> grOkthen Halt(1); {обработка результата установки}end;
OutTextXY(210, 320 + 30, ‘Успеваемость по четвертям’);
end;
Begin
Init;
Diagram 1; repeat until keypressed
End.
Построение дуги. Для построения дуги. необходимо указать центр соответствующей окружности (х и у), начальный и конечный углы дуги и радиус. Углы отсчитываются против часовой стрелки, их значение указывается в градусах (от 0 до 359). Отсчет угла производится от направленного вправо по горизонтали радиуса. Оператор построения дуги имеет вид:
Если указать значения углов соответственно 0 и 359, то получится окружность или закрашенный текущим цветом круг. Окружность можно также изобразить оператором:
Circle (х, у, г);
Рассмотрим пример построения «рога изобилия», состоящего из окружностей. Центры окружностей перемещаются по окружности, представляющей собой траекторию точки, одна координата которой задается косинусом, а другая — синусом одного и того же угла x1/k. При k = 20 получается замкнутый круг, k = 10 — два круга, k = 30 — полукруг.
program Р35;
uses Graph, Crt;
procedure Init; {установка графического режима}
var gr, gm:integer;
Begin
gr: = 0; {автоматическое распознавание типа дисплея}
InitGraph (gr, gm, ‘ ‘); {файл egavga.bgi находится в одном каталоге с turbo.ехе}
Диаграммы такого типа представляют собой круги, разделенные н. секторы разной площади (рис. 14) Площадь каждого сектора соответствует некоторой части, как правило, в процентном отношении, а за единицу (целое) принимается площадь всего круга. Вместо площади сектора можно рассчитать длину дуги. Построим круговую диаграмму изменения успеваемости, соответствующую линейной диаграмме на рисунке 13.
Программа имеет вид:
program Р38;
uses Graph, Crt;
procedure Init; {установка графического режима}
var gr, gm:integer;
Begin
gr: == 0; {автоматическое распознавание типа дисплея}
InitGraph (gr, gm, ‘ ‘); {файл egavga.bgi находится в одном каталоге с turbo.exe}