- •Часть II Оглавление
- •Строки. Процедуры и функции для работы со строками.
- •Множества. Операции над множествами.
- •Подпрограммы для работы со всеми типами файлов
- •Текстовые файлы
- •Бестиповые файлы
- •Типизированные файлы
- •Прямой доступ
- •Оператор with.
- •Вариантная запись.
- •Динамические структуры данных
- •Процедуры и функции. Рекурсия. Модули.
- •Основы объектно-ориентированного программирования
- •Графика
Графика
В данном параграфе мы познакомимся с графическими средствами языка Free Pascal, рассмотрим основные процедуры и функции работы с графикой.
Графика на языке Free Pascal реализована на основе стандартной библиотеки Graph языка программирования Turbo Pascal 7.0., но при этом поддерживает современные графические режимы и графические драйверы, которые не зависят от конкретной платформы.
Модуль GRAPH содержит десятки стандартных программ и типов данных, а также около 80 графических процедур и функций. Подключение этого модуля к пользовательской программе осуществляется директивой uses graph.
С момента подключения модуля GRAPH становятся доступны все графические средства.
Рассмотрим некоторые особенности работы с графикой в различных ОС.
Графика в Linux
В языкеFree Pascal есть несколько модулей для работы с графикой (совместимых с модулем Graph языка Turbo Pascal) под Linux:
graph,
ggiGraph,
ptcGraph,
sdlGraph.
У стандартного модуля graph под ОС Linux, есть ряд проблем:
1.Linux модуль graph использует библиотеку libvga. Эта библиотека работает тольков консоли.
2. При попытке инициализации модуля может появиться сообщение об ошибке/usr/bin/ld: cannot find -lvga
Данная проблема может возникнуть по нескольким причинам: libvga установлен неправильно, или на нее указывает неправильный путь. Для того, чтобы исправить данные проблемы, нужно переустановить пакет libvga. Или добавить путь к компилятору командной строки.
3.Для запуска программ, использующих libvga нужны привилегии root.
В связи с перечисленными проблемами лучше использовать один из доступных работающих и лёгких в использовании аналогов. Советуем использовать модуль: ptcGraph.
Для своей работы модуль требует две библиотеки:
Xxf86vm (файл libXxf86vm.so).
Xxf86dga (файл libXxf86dga.so).
Необходимо проверить их наличие в каталогах: (/usr/lib/, /lib/.)
Если у этих библиотек нет, то необходимо установить их из репозитария операционной системы.
Графика в Windows
В языкеFree Pascal есть несколько модулей для работы с графикой (совместимых с модулем Graph языка Turbo Pascal) под Windows:
graph,
ptcGraph,
sdlGraph.
Использование модуля Graph во Free Pascal во многом совпадает с аналогичным модулем из языка Turbo Pascal, главное отличие состоит в том, что графика запускается в отдельном окне.
Работы с любой программой начинается с инициализации графического режима:
InitGraph (var Gd: integer; var Gm: integer; Path: string)
Этой процедурой устанавливается драйвер, режим и путь к каталогу, где находится драйвер. Обычно драйверы подключаются в режиме авто определения используемого монитора ПК. Для этого перед инициализацией графики задается Gd:= Detect(или Gd:= 0). В этом случае по умолчанию устанавливается режим с наибольшим числом точек на экране, а значение параметра "Gm" игнорируется.
Инициализацию графического режима в ОС Linux рекомендуем осуществлять при помощи процедуры:
DetectGraph(var Gd: SmallInt; var Gm: SmallInt);
Т.к. при помощи Gd:= Detect в Linux автоматически определяется оптимальный режим для видеокарты, который может не поддерживаться монитором.
Графический режим следует включать таким образом:
var
Gd: SmallInt; // Номер драйвера
Gm: SmallInt; // Номер графического режима
...
begin
DetectGraph(Gd, Gm);
InitGraph(Gd, Gm, '');
...
end.
Номер наибольшего режима для текущего драйвера возвращает функция GetMaxMode. Изменить режим можно процедурой SetGraphMode(Gm). Экран при этом очищается.
Третий параметр – путь к драйверу; если он расположен в текущем каталоге, то вместо маршрута ставятся пустая строка (два апострофа).
Для построения изображений на экране используется система координат. Отсчет начинается с левого верхнего угла, который имеет координаты (0,0). Цена деления - один пиксель.
Разрешающую способность для текущего графического режима можно определить функциями, возвращающими максимальные значения координат экрана:
GetMaxX - по оси Х; GetMaxY- по оси Y.
Для возврата из графического режима в текстовый можно использовать операторы:
CloseGraph - полное прекращение работы графической системы;
RestoreCrtMode - переключение в текстовый режим с возможностью возврата к текущим установкам графического режима (оператором SetGraphMode).
Очистить графический экран можно процедурой ClearDevice (без изменения установленных параметров) либо GraphDefaults (устанавливаются параметры, принятые по умолчанию).
Процедуры рисования
SetBkColor(N)- установить цвет N для пикселов фона.
SetColor(N)- установить цвет N для выводимых линий.
PutPixel(X, Y, N) - высветить цветом N пиксель с координатами X,Y.
GetPixel(X, Y)- определить цвет пикселя с координатами X, Y.
При задании цвета можно использовать следующие коды:
-
Наименование цвета
Цвет
Код цвета
Black
черный
0
Blue
синий
1
Green
зеленый
2
Gyan
бирюзовый
3
Red
красный
4
Magenta
малиновый
5
Brown
коричневый
6
LightGray
светло-серый
7
DarkGray
темно-серый
8
LightBlue
голубой
9
LightGreen
ярко-зеленый
10
LightGyan
ярко-бирюзовый
11
LightRed
ярко-красный
12
LightMagenta
ярко-малиновый
13
Yellow
желтый
14
White
белый
15
Circle(X, Y, R)- окружность с центром X, Y радиуса R.
Arc(X,Y, A1,A2, R)- дуга окружности.
Ellipse(X,Y, A1,A2, RX, RY)- сектор эллипса с полуосями RX, RY.
A1, A2 - начальный и конечный углы (в градусах), отсчитываемые против часовой стрелки относительно оси Х.
Line(X1,Y1, X2,Y2)- отрезок прямой от точки с координатами X1,Y1 к точке с координатами X2,Y2.
LineTo(X, Y)- отрезок прямой от текущего положения курсора до точки X, Y.
LineRel(dX, dY)- отрезок прямой от текущего положения курсора до точки, смещенной на расстояние dX, dY.
В отличие от процедуры Line процедуры LineTo и LineRel при своем исполнении перемещают текущий указатель. Перемещать курсор без рисования можно процедурами MoveTo(X, Y) и MoveRel(dX, dY).
В графическом режиме курсор невидим, а его положение можно определить функциями, возвращающими значения координат: GetX- по оси Х, GetY- по оси Y.
Rectangle(X1, Y1, X2, Y2)- прямоугольник с левым верхним углом в точке X1,Y1 и правым нижним углом в точке X2,Y2 (стороны параллельны краям экрана).
Процедуры построения заполненных фигур
Граница заполняемых фигур рисуется текущим цветом для линий. Цвет N и стиль заполнения P (орнамент) можно устанавливать из стандартного набора BGI или определять самим процедурой SetFillStyle(P, N).
Типы и толщина линий:
0 – сплошная;
1 – точечная;
2 – штрихпунктирная;
3 – пунктирная.
Шаблоны штриховки:
-
Наименование шаблона
Вариант заполнения
Код цвета
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
Bar(X1,Y1, X2,Y2)- прямоугольник;
Bar3d(X1,Y1, X2,Y2, d, t)- параллелепипед с заполненной передней гранью (координаты углов грани X1,Y1, X2,Y2) глубиной d.
Переменная t типа boolean задает вывод верхней грани. При t=TopOn (true) верхняя грань показывается, при t=TopOff (false) - нет.
FillEllipse(X,Y, RX,RY)- заполненный эллипс;
Sector(X,Y, A1,A2, RX,RY)- заполненный сектор эллипса;
PieSlice(X,Y, A1,A2, R)- заполненный сектор круга.
FillPoly(N, M)- заполнить произвольную плоскую фигуру с границей, описанной массивом N точек границы. М – параметр типа PointType ( var M: array[1..N] of PointType).
Задача 1.
Нарисовать параллелепипед белого цвета по введенным с клавиатуры координатам.
uses graph;
var gd,gm,x1,x2,y1,y2,d:integer;
begin
gd:=detect;
initgraph(gd,gm,'');
setcolor(white);
writeln('Введите координаты параллелепипеда');
writeln('x1,x2,y1,y2,глубина);
readln(x1,y1,x2,y2,d);
bar3d(x1,y1,x2,y2,d,true);
readln;
closegraph;
end.
Задача 2.
Нарисовать увеличивающуюся со временем окружность белого цвета.
uses crt,graph;
var gd,gm,x,r,y,i:integer;
begin
gd:=detect;
initgraph(gd,gm,'');
x:=getmaxx div 2;
y:=getmaxy div 2;
r:=50;
for i:=1 to 30 do
begin
delay(50);
setcolor(white);
circle(x,y,r);
delay(50);
setcolor(black);
circle(x,y,r);
r:=r+5;
end;
readln;
closegraph;
end.
Отметим, что в настоящее время реализовано большое количество альтернативных модулей для работы с графикой любой сложности. Например: GraphiX, OpenGL, DGLEngine и д.р.
Некоторые возможности библиотеки DGLEngine:
Работа с 2D графикой под OpenGL,
Поддержка двумерных и трехмерных шрифтов.
Возможность совмещения 2D и 3D графики.
Работа с 3D графикой и различные 3D эффекты и возможности (например освещение, блики и т.д.)
Загрузка анимированных и текстурированных 3D моделей из 3DStudioMax.
Загрузка и проигрывание видеофайлов(AVI, DIVX, MPEG, INDEO), как в полноэкранном режиме, так и в качестве текстуры.
Проигрывание музыки MP3,MIDI,WMA и прочие популярные форматы.
Задания для самостоятельной работы.
Нарисовать в центре экрана эллипс.
Нарисовать звезду.
Нарисовать облако (использовать окружности).
Нарисовать n окружностей случайного размера и цвета в случайных местах экрана.
Построить графики функции:
y=x-3;
y=sin(x);
y=x*x+0,5;
Нарисовать круг, движущийся из одного угла экрана в другой.
Нарисовать квадрат, движущийся по окружности. После каждого прохождения квадрат должен менять цвет.
