Тема №3 Графический модуль GraphABC

Тема №3 Графический модуль GraphABC

Система ABC Pascal обладает великолепной графической библиотекой. Для ее модключения после заголовка программы необходимо написать Uses GraphABC. Модуль GraphABC содержит константы, типы, процедуры и функции для рисования в графическом окне. Они подразделяются на несколько групп:

* Графические примитивы

* Действия с кистью

* Действия с цветом

* Действия со шрифтом

* Действия с точками и прямоугольниками

* Действия с рисунками

* Действия с пером

* Действия с графическим окном

Рассмотрим сразу пример:

Program Gr01;

Uses GraphABC;

begin

SetWindowSize(256,256);

SetPenColor(RGB(0,0,255));

Line(0,0, WindowWidth, WindowHeight)

Line(0,WindowHeight, WindowWidth, 0)

end.

Процедура SetWindowSize устанавливает размер графического окна 256?256 пикселей.

Процедура SetPenColor определяет цвет рисования линий. Функция RGB возвращает цвет, заданный своими Red, Green, Blue компонентами. Процедура Line рисует линию из точки, заданной первой парой координат, в точку, заданную второй парой координат. Функции WindowWidth и WindowHeight возвращают текущие значения ширины и высоты графического окна (следовательно, если вы поменяете размер окна в процедуре SetWindowSize, то линии все равно будут проводиться из угла в угол).

Оконные координаты

* Координата x растет слева на право от 0 до значения WindowWidth

* Координата y растет сверху вниз от 0 до значения WindowHeight

- 11 -

Задание цвета

Как известно восприятие цвета у человека трехцветное. Основываясь на этом, в графических библиотеках используется именно такое трехкомпонентное представление цвета. Цвет задается с помощью функции rgb(Red, Green,Blue)

Здесь

* Red – число от 0 до 255, соответствующее интенсивности красной компоненты

* Green – число от 0 до 255, соответствующее интенсивности зеленой компоненты

* Blue – число от 0 до 255, соответствующее интенсивности синей компоненты

Функция формирует целое число (integer), которое может использоваться везде в графической библиотеке, где требуется указание цвета. Есть несколько предопределенных цветов:

clBlack – черный

clCream – кремовый

clPurple – фиолетовый

clAqua – бирюзовый

clWhite – белый

clOlive – оливковый

clMaroon – темно-красный

clFuchsia – сиреневый

clRed – красный

clTeal – сине-зеленый

clNavy – темно-синий

clGray – серый

clGreen – зеленый

clLime – ярко-зеленый

clBrown – коричневый

clLightGray – светло-серый

clBlue – синий

clMoneyGreen – цвет зеленых денег

clSkyBlue – голубой

clDarkGray – темно-серый

clYellow – желтый

Задание стиля и цвета пера

* SetPenColor(цвет) – устанавливает цвет пера, задаваемый параметром color.

* SetPenWidth(ширина) – устанавливает ширину пера.

* SetPenStyle(стиль) – устанавливает стиль пера (сплошной, пунктир и т.п.), возможные значения указаны в таблице (стиль применим только к ширине пера 1 пиксел)

psSolid

psDash

psDashDot

psClear

psDot

psDashDotDot

Текущее перо используется для рисования линий, прямоугольников, ломаных, окружностей, эллипсов, дуг и т.п.

Пример:

Program Gr02;

Uses GraphABC;

Var i : integer;

begin

SetWindowSize(512,512);

SetPenStyle(psDash);

SetBrushStyle(bsClear);

Circle (256,256,WindowHeight div 2);

end.

- 12 -

Задание стиля и цвета кисти

* SetBrushColor(цвет) – устанавливает цвет кисти

* SetBrushPicture(имя файла) – устанавливает в качестве образца для закраски кистью образец, хранящийся в файле, при этом текущий цвет кисти при закраске игнорируется.

* ClearBrushPicture – очищает рисунок-образец, выбранный для кисти.

* SetBrushStyle(стиль) – устанавливает стиль кисти, задаваемый параметром bs.

Возможные стили кисти:

bsSolid bsClear bsCross bsDiagCross bsHorizontal bsBDiagonal bsVertical bsFDiagonal

Текущей кистью закрашиваются все замкнутые фигуры, контур фигур рисуется текущим пером. Чтобы нарисовать не закрашенную фигуру, используйте SetBrushColor(bsClear).

Пример:

Program Gr03;

Uses GraphABC;

Var i,j : integer;

begin

SetWindowSize(512,512);

SetBrushColor(rgb(128,0,255));

SetBrushStyle(bsDiagCross);

Rectangle(10,10,WindowWidth-10,WindowHeight-10);

end.

Некоторые графические примитивы[6]

* Line(x1, y1, x2, y2) – рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

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

* Ellipse(x1, y1, x2, y2) – рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).

* Rectangle(x 1,y1,x2,y2) – рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).

* RoundRect(x 1,y1,x2,y2,w,h) – рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

* Arc(x,y, r, a1,a2) – рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

* Pie(x,y,r,a1,a2) – рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

* Chord(x,y, r, a1,a2) – рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

* FloodFill(x,y,color) – закрашивает область одного цвета, начиная с точки (x,y) цветом color.

Задание:

Напишите программу, использующую не менее трех процедур рисования, которая рисовала бы несложный рисунок (домик, автомобиль, и т.п.)

- 13 -

Пример решения задания

Program avto;

uses graphABC;

var i : integer;

begin

SetWindowSize (800,600);

SetPenStyle (psClear); // верхняя часть автомобиля

setBrushColor (Clgreen);

rectangle (250,250,550,351);

setBrushColor (ClAqua); // окна

rectangle (255,255,395,345);

rectangle (405,255,545,345);

setBrushColor (Clgreen); // корпус

rectangle (50,350,750,500);

setBrushColor (ClYellow); // фары

rectangle (749,375,764,400);

setBrushColor (ClRed);

rectangle (35,375,51,400);

setBrushColor (ClLightGray); // бампер

RoundRect (725,450,775,475,10,10);

RoundRect (25,450,75,475,10,10);

SetPenStyle (psSolid); // двери

Line(250,350,250,425);

Line(250,425,300,500);

Line (400,250,400,500);

Line (550,350,550,425);

Line (550,425,500,500);

setBrushColor (ClBlack); // колеса

Circle (200,500,50);

setBrushColor (ClLightGray);

Circle (200,500,25);

setBrushColor (ClBlack);

Circle (600,500,50);

setBrushColor (ClLightGray);

Circle (600,500,25);

end.

- 14 -