Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
freePascal 2.0_0.doc
Скачиваний:
13
Добавлен:
01.05.2025
Размер:
343.55 Кб
Скачать

Графика

В данном параграфе мы познакомимся с графическими средствами языка 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 и прочие популярные форматы.

Задания для самостоятельной работы.

  1. Нарисовать в центре экрана эллипс.

  2. Нарисовать звезду.

  3. Нарисовать облако (использовать окружности).

  4. Нарисовать n окружностей случайного размера и цвета в случайных местах экрана.

  5. Построить графики функции:

  • y=x-3;

  • y=sin(x);

  • y=x*x+0,5;

  1. Нарисовать круг, движущийся из одного угла экрана в другой.

  2. Нарисовать квадрат, движущийся по окружности. После каждого прохождения квадрат должен менять цвет.

62

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