Сайт Льва Волкова
  
Мы сопротивляемся нашим страстям не потому, что мы сильны, а потому, что они слабы. Ф.Ларошфуко
 
      На главную  
 Личное
  Статьи
  Задачи 
 Ссылки
 АТ-531
www.levvol.ru    
 
Модуль Graph
Понятие графического адаптера

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

Рассмотрение работы в графическом режиме:

Для управления экраном в графическом режиме с помощью программ в Turbo Pascal существуют специальные графические процедуры и функции. Описание этих процедур и функций содержится в специальном библиотечном модуле CRAPH.

Запуск графической системы. Для запуска графической системы необходимо сделать следующее:

  1. Подключить модуль CRAPH - библиотеку графических процедур: uses graph;
  2. Установить графический режим с помощью двух переменных:
    var DriverVar, ModeVar: integer;
    begin
    DriverVar:=Detect;
    InitGraph(DriverVar, ModeVar,’\TP\GRAPH’);
    

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

 

вверх страницы
Процедуры и функции модуля CRAPH

Здесь представлены не все процедуры и функции модуля GRAPH, а только самые необходимые.

Процедуры
Arc (X,Y:Integer; U1, U2, R:Word)

Строит дугу окружности текущим цветом с текущими параметрами линии. X, Y - координаты центра дуги; U1 - угол до начальной точки дуги, отсчитываемый против часовой стрелки от горизонтальной оси, направленной с лева на право; U2 - угол до конечной точки дуги, отсчитываемый так же, как U1; R - радиус дуги.


Bar (X1, Y1, X2, Y2:Integer)

Строит прямоугольник, закрашенный текущим цветом с использованием текущего стиля (орнамента, штриховки). X1, Y1, X2, Y2 - координаты левого верхнего и правого нижнего углов прямоугольника.


Bar3D (X1, Y1, X2, Y2:Integer; Glubina: Word; Top:Boolean)

Строит параллелепипед, используя текущий стиль и цвет. X1, Y1, X2, Y2 - координаты левого верхнего и правого нижнего углов передней грани; Glubina - ширина боковой грани (отсчитывается по горизонтали); Top - признак включения верхней грани (если True - верхняя грань вычерчивается, False - не вычерчивается).


Circle (X, Y: Integer; R: word)

Рисует текущим цветом окружность радиуса R с центром в точке (X, Y).


ClearDevice

Очищает графический экран, закрашивает его в цвет фона.


ClearViewPort

Очищает выделенное графическое окно, закрашивает его в цвет фона.


CloseGraph

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

Для временного вызхода из графического режима в текстовый используется процедура

RestoreCRTMode

Для обратного входа в графический режим - процедура

SetGraphMode


Ellipse (X, Y: Integer; U1, U2, XR, YR: Word)

Рисует дугу эллипса текущим цветом. X, Y - координаты центра эллипса; U1, U2 - углы до начальной и конечной точек дуги эллипса (см. процедуру Arc); XR, XY - горизонтальная и вертикальная полуоси эллипса.


Fill Ellipse (X, Y: Integer; U1, U2, XR, YR: Word)

Рисует заштрихованный эллипс, используя X, Y как центр и XR, YR как горизонтальную и вертикальную полуоси эллипса.


FillPoly (N: Word; Var PolyPoints)

Рисует и штрихует многоугольник, содержащий N вершин с координатами в поле PolyPoints.


FloodFill(x,y:integer; border:word);

Заполняет замкнутую область, x, y - координаты точки, находящейся внутри области; border - цвеет замкнутого контура ограничивающего область. Точка x , y должна быть внутри области, но не на границе. Область обязательно должна быть замкнутой (фигуры нарисованные несплошной линией не являются замкнутыми). По умолчанию область закрашивается цветом фона, но цыет и стиль закраски можно изменить процедурой SetFillStyle.


GetImage(x1,y1,x2,y2:integer; var bitmap)

Копирует изображение прямоугольной области заданной координатами левой верхней и правой нижней вершин (первые четыре параметра) в буфер bitmap. Под bitmap должна быть динамически выделена память необходимого размера.


GetMem(bitmap,size)

Выделяет память под bitmap. Здесь size -размер выделяемой памяти. (см. динамическая память). Узнать размер выделяемой памяти size можно с помощью функции ImageSize.


ImageSize(x1,y1,x2,y2:integer):word;

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


PutImage(x1,y1:integer; var bitmap; op:word);

Выводит сохраненное ранее изображение на экран. Указываются координаты левой верхней вершины прямоугольной области сохраненного изображения (правая нижняя вершина не указывается, так как длины сторон прямоугольной области сохраняются при сохранении изображения). Параметр bitmap - имя буфера памяти, где ранее было сохранено изображение. Параметр op задает логическую операцию, определяющую способ взаимодействия вновь размещаемой копии с уже имеющимся на экране изображением. Взаимодействие осуществляется путем применения кодируемых этим параметром логических операций к каждому биту копии и изображения.

Таблица 1. Логичесие операции процедуры PutImage

ЗначениеИмяОперация
0NormalPutЗамена существующего изображения на копию. Просто стирает часть экрана и помещает на это место копию из памяти в том виде, как она там сохранена.
1XorPutИсключающее ИЛИ. Повторный вывод с этим параметром фракметна изображения на тоже место экрана, откуда была получена копия, сотрет эту часть экрана. Если операцию применить дважды к одному и тому же участку экрана, вид изображения на экране не изменится. Таким образом можно довольно просто перемещать изображения по экрану, создавая иллюзию движения.
2OrPutИЛИ.
3AndPutИ.
4NotPutИнверсия изображения. Светлые пиксели становятся тёмными и наоборот.


InitGraph (Var Driver, Mode:Integer; Path: String)

Организует переход в графический режим. Переменные Driver и Mode содержат тип графического драйвера и его режим работы. Третий параметр определяет маршрут поиска графического драйвера. Если строка пустая (т.е. равна ’’), считается, что драйвер находится в текущем каталоге.


Line (X1, Y1, X2, Y2:Integer)

Рисует линию от точки X1, Y1, до точки X2, Y2.


LineTo (X,Y:Integer)

Рисует линию от текущего указателя к точке X, Y.


MoveTo (X,Y:Integer)

Смещает текущий указатель к точке X, Y.


MoveRel (dX,dY:Integer)

Смещает текущий указатель на dX позиций по оси X и на dY позиций по оси Y относительно активной точки.


OutTextXY (X,Y:Integer; TextString: String)

Выводит текст в заданное место экрана.


OutText (TextString: String)

Выводит текст TextString с текущей позиции курсора.

Процедуры вывода write и writeln в графическом режиме не работают. Для вывода в графическом режиме применяют процедуры OutText и OutTextXY. Этими процедурами можно выводить только символьную информацию.


PieSlice (X,Y:Integer; U1, U2, Radius: Word)

Строит сектор круга, закрашенный текущей штриховкой и цветом заполнения. X, Y - координаты центра сектора круга; U1 и U2 - начальный и конечный углы сектора, отсчитываемые против часовой стрелки от горизонтальной оси, направленной в право; Radius - радиус сектора.


PutPixel (X,Y:Integer; Color: Word)

Выводит точку цветом Color с координатами X, Y.


Rectangle (X1, Y1, X2, Y2)

Рисует контур прямоугольника, используя текущий цвет и тип линий. X1, Y1 - координаты левого верхнего угла прямоугольника; X2, Y2 - координаты левого правого нижнего угла прямоугольника.


Sector (X, Y: Integer; U1, U2, XR, YR: Word)

Рисует и штрихует сектор эллипса радиусом XR, YR с центром в X, Y от начального угла U1 к конечному углу U2.


SetBkColor (Color: Word)

Устанавливает цвет фона.


SetColor (Color: Word)

Устанавливает основной цвет рисования.


SetFillStyle (Pattern, Color: Word)

Устанавливает образец штриховки и цвета.

Таблица 2. Cтили (орнаменты) штриховки Pattern.

ЗначениеИмяСтиль штриховки
0EmptyFillЗаполнение цветом фона
1SolidFillСплощное заполнение цветом, указанным в параметре SetFillStyle
2LineFillЗаполнение горизонтальными линиями
3LtSlashFillЗаполнение линиями вида ///
4SlashFillЗаполнение толстыми линиями вида ///
5BkSlashFillЗаполнение толстыми линиями вида \\\
6LtBkSlashFillЗаполнение толстыми линиями вида \\\
7HatchFillЗаполнение прямой клеткой
8SlashFillЗаполнение косой клеткой
9InterleaveFillЗаполнение частой сеткой
10WideDot FillЗаполнение редкими точками
11CloseDotFillЗаполнение частыми точками
12UserFillЗаполнение определяется программистом

Все примитивы, рисующие закрашенные области, закрашивают эти области либо цветом фона (по умолчанию), либо стилем и цветом, указанным в процедуре SetFillStyle.


SetLineStyle (LineStyle, Pattern, Thickness: Word)

Устанавливает толщину и тип линии.

Таблица 3. Значения параметра толщины линии Thickness

ЗначениеИмяВид линии
1NormWidthТолщина линии в 1 пиксел
3ThickWidthТолщина линии в 3 пиксела

Таблица 4. Значения параметра толщины линии LineStyle

ЗначениеИмяВид линии
0SolidLnСплошная линия
1DottedLnПунктирная линия
2CenterLnШтрихпунктирная линия
3DashedLnШтриховая линия
4UserBitLnСтиль линии задается пользователем

Параметр Pattern воспринимается только в случае, если стиль линии задается пользователем (т.е. параметр LineStyle равен 4 или SolidLn). В остальных случаях параметр Pattern принимается равным 0.

Шаблон задается для каждых 16 пикселов линии и представляет собой двухбайтовое число, каждый бит которогоравет 1, если соответствующих пиксел инициализируется, и 0 - в противном случае.

Первые два параметры SetLineStyle воспринимаются только для прямых линий. Для дуг и окружностей можно задавать только толщину линий.

Тонкая пунктирная линия SetLineStyle(1,0,1); Line(0,0,100,200);

Толстая линия, орнамент задан пользователем SetLineStyle(4,$4c70,3); Line(100,200,200,100);


SetTextStyle (Font, Direction, CharSize: Word)

Устанавливает текущий шрифт, направление (горизонтальное или вертикальное) и размер текста.

Параметр Font - номер шрифыта.

Таблица 5. Значения параметра Font

ЗначениеИмя шрифтаВид шрифта
0DefaultFontШрифт по умолчанию
1TriplexFontПолужирный шрифт
2SmallFontСветлый шрифт (тонкое начертание)
3SansSerifFontКнижная гарнитура (рубленный текст)
4GothicFontГотический шрифт

Параметр Direction может принимать два значения - 0 или HorizDir - горизотналь

Здесь надо отметить, что в Turbo Pascal'е используется два вида шрифтов? матричные и векторные. В матричных шрифтах симовл задается набором точек, которые в совокупности складываются в символ. В векторных шрифтах задается лищь набор опорных точек и способ соединения этих точек линиями.

Из стандартных шрифтов только DefaultFont - матричный, остальные - векторные.

Для векторных шрифтов возможно неравномерное изменение символов по осям X и Y. Для этого перед процедурой SetTextStyle надо вызвать процедуру

SetUserCharSize(multx,divx,multy,divy:worrd),

которая умножает базовую ширину шрифта на коэффициент multx/divx, а базовую высоту - на коэффициент multy/divy. При использовании коэффициентов масштабирования текста в процедуре SetTextStyle параметр CharSize необходимо принять равным 0.

Параметр CharSize в процедуре SetTextStyle - коэффициент масштабирования размеров букв (значение от 1 до 10).


SetViewPort (X1, Y1, X2, Y2:Integer; ClipOn: Boolean)

Устанавливает прямоугольное окно на графическом экране. Параметр ClipOn определяет “отсечку” элементов изображения, не умещающихся в окне.


 

вверх страницы
Функции
GetMaxX  GetMaxY

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


GraphResult

Возвращает значение GrOk, соответствующее коду 0, если все графические операции программы выполнились без ошибок, или возвращает числовой код ошибки (от -1 до -14).


Использование процедур и функций при решении задач. Рассмотрение структуры программы.

Построить правильный многоугольник с заданным числом сторон.

Решение.

Центр многоульника совмещаем с центром экрана. Пусть N - число его сторон.

Центральный угол стороны Angle=2 * Pi / N.

Начальную вершину многоугольника поместим на горизонтальной оси (правее центра).

Угол наклона i-й вершины к оси Х составляет Angle * i, а ее центральные координаты X, Y -

X = round (R*cos(Angle*i));
     Y = round (R*sin(Angle*i));

Где R - радиус описанной окружности.

Проводим i-ю сторону, соединяя линией найденную i-ю и предыдущую вершины. Выполнив это построение для всех i от 1 до N, получим наш многоугольник. (Отметим, что N-я вершина совпадает с начальной .)

Program Test;
{ Построение правильного многоугольника с N сторонами} 
Uses graph, crt;
Const
   PrD:real=80; 
   {Длина диаметра описанной окружности в % от высоты экрана}
   PATH=’’; 
   {Файлы *.BGI находятся в рабочем каталоге}
Var 
   W,H,gd,gm,i,N,X,Y.R:integer;
   Angle:real;
{переход от центральных координат к экранным}
Procedure WH (var W,H:integer); 
{ширина и высота экрана}
Begin
   {функция GetMaxX и GetMaxY возвращают максимальные
  значения соответствующих экранных координат}
   W:=GetMaxX+1; { ширина}
   H:=GetMaxY+1; { высота}
End;
{---------------------------------}
Function Xscr(X:integer):integer;
Begin Xscr:=X + W div 2 end;
{---------------------------------}
Function Yscr (Y:integer):integer;
Begin Yscr:=H div 2 - Y end;
{--------------------------------}
BEGIN
 repeat
 write('Укажите число сторон ');
 write('правильного многоугольника, не менее 3= ’);
 readln(N);
 until N>2;
  gd:=DETECT;
  initgraph (gd,gm,path);{включение графического режима}
  WH(W,H); 
  {определяем ширину и высоту экрана}
  R:=round(PrD*0.01/*H/2);
  { радиус описанной окружности}
  Angle:=2*pi/N; 
  {центральный угол стороны в радианах}
  MoveTo(Xscr(R), Yscr(0)); 
  {первая вершина в экранных координатах}
  SetColor (Yellow);
  {цвет многоугольника - желтый}
  For i:=1 to N do begin {цикл сторон}
  {X и Y - центральные координаты очередной вершины}
  X:=round (R*cos(Angle*i));
  Y:= round (R*sin(Angle*i));
  {проводим очередную сторону}
  LineTo (Xscr(X), Yscr(Y));
  End; {цикл сторон}
  Repeat 
  until keypressed; 
 {Выход - нажатием любой клавиши}
  CloseGraph; 
  {переход в текстовый режим}
End.

вверх страницы

 

[назад] [содержание] [вперед]