Стандартный модуль работы с графическим экраном Graph

1) назначение модуля

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

  • подключить раздел графических подпрограмм Турбо-Паскаля, что выполняется в самом начале раздела описаний оператором USES Graph;
  • инициализировать графику в выполняемом блоке, для чего загрузить в память драйвер управления монитором в графическом режиме. Это делается процедурой InitGraph(...). Далее выполняется выбор цветов и характеристик графических примитивов (точек, линий, стандартных фигур и полигонов, символов текста) и изображаются нужные объекты, с помощью стандартных процедур и функций. По окончании работы графический режим монитора выключается (закрытием графики процедурой CloseGraph).

2) координаты экрана

Определяются возможностями видеосистемы ПЭВМ. Обычно стараются использовать наилучший возможный режим экрана

{ *** функции, связанные с координатами *** }

function GetX : integer; – получить текущую координату X;

function GetY : integer; – получить текущую координату Y;

function GetMaxX : integer; – получить максимально возможную координату экрана по X;

function GetMaxY : integer; – получить максимально возможную координату экрана по Y;

3) управление графическим режимом

{ *** определение, инициализация и восстановление текстового режима *** }

procedure DetectGraph (var GraphDriver, GraphMode : integer); – получение возможного типа драйвера и графического режима по установленным аппаратным средствам;

procedure InitGraph (var GraphDriver : integer;

var GraphMode : integer;

PathToDriver : String); – инициализировать графический режим экрана;

function GetMaxMode : integer; – получение наилучшего графического режима для данной ПЭВМ;

procedure SetGraphMode (Mode : integer); – задание графического режима;

function GetGraphMode : integer;– получение текущего графического режима;

procedure GraphDefaults; – установление графических параметров по-умолчанию (стандартных)

procedure RestoreCrtMode; – возвращение экрана в состояние, которое было до установления графики

procedure CloseGraph; – закрытие графического режима.

{ Коды завершений графических операций: }

grOk = 0; – без ошибок.

grNoInitGraph = -1; – не загружен драйвер графического режима.

grNotDetected = -2; – не определен тип видеокарты.

grFileNotFound = -3; – не найден файл с драйвером.

grInvalidDriver = -4; – ошибка работы драйвера.

grNoLoadMem = -5; – не хватает места в ОП для загрузки драйвера.

grNoScanMem = -6; – выход за пределы памяти при сканирующем заполнении

grNoFloodMem = -7; – выход за пределы памяти при заливке.

grFontNotFound = -8; – не найден заказанный шрифт.

grNoFontMem = -9; – не хватает места в ОП для загрузки шрифта.

grInvalidMode = -10; – неверный режим графики.

grError = -11; – ошибка графической операции.

grIOerror = -12; – ошибка графического ввода/вывода

grInvalidFont = -13; – ошибка в файле шрифта.

grInvalidFontNum = -14; – недопустимый номер шрифта.

{ *** Функции, возвращающие сведения об ошибках *** }

function GraphErrorMsg (ErrorCode : integer) : String; – название ошибки по коду;

function GraphResult : integer; – код ошибки последней графической операции.

4) управление экраном и окном

{ *** экран, окна, сохранение и восстановление окон *** }

procedure ClearDevice; – очиска грфического экрана цветом фона. Текущий указатель в левом верхнем углу;

procedure SetViewPort (x1, y1, x2, y2 : integer; Clip : boolean); – задание границ окна и типа отсечения;

procedure GetViewSettings (var ViewPort : ViewPortType); – получить характеристики окна;

procedure ClearViewPort; – очистить окно цветом фона;

procedure SetVisualPage (Page : word); – задает номер отображаемой графической страницы;

procedure SetActivePage (Page : word); – устанавливает для графического вывода активную страницу.

{ *** сохранение/восстановление части экрана *** }

function ImageSize (x1, y1, x2, y2 : integer) : word; – определить размер ОП для прямоугольника;

procedure GetImage (x1, y1, x2, y2 : integer; var BitMap); – сохранить в ОП образ прямоугольника;

procedure PutImage (X, Y : integer; var BitMap; BitBlt : word); – восстановить прямоугольник из ОП.

5) управление цветом

{ константы изображения цветов: }

Таблица 27. Кодировка цветов

Код Имя константы Цвет
Black Черный (прозрачный)
Blue синий
Green зеленый
Cyan голубой
Red красный
Magenta фиолетовый
Brown коричневый
LightGray светло-серый
DarkGray темно-серый
LightBlue светло-голубой
LightGreen светло-зеленый
LightCyan светло-синий
LightRed светло-красный
LightMagenta светло-фиолетовый (розовый)
Yellow светло-коричневый(желтый)
White белый

{ *** процедуры работы с цветом *** }

procedure SetBkColor (ColorNum : word); – установить цвет фона;

procedure SetColor(Color : word); – установить цвет рисования

function GetBkColor : word; – получить цвет фона;

function GetColor : word; – получить текущий цвет рисования;

function GetMaxColor : word; – получить максимально-возможное число цветов.

6) вывод точек

{ *** процедуры работы с точкой *** }

procedure PutPixel (X, Y : integer; Pixel : word); – поставить на экране точку (X,Y) заданным цветом (pixel);

function GetPixel (X, Y : integer) : word; – получить цвет точки с координатами (Х,Y).

7) вывод линий

{ типы и толщины линий для процедур Get/SetLineStyle: }

SolidLn = 0; { сплошная };

DottedLn = 1; { пунктирная };

CenterLn = 2; { штрих-пунктирная (осевая) };

DashedLn = 3; { штриховая };

UserBitLn = 4; { задаваемая пользователем };

NormWidth = 1; { нормальная (тонкая) } ;

ThickWidth = 3; { толстая }.

{ *** процедуры перемещений и проведения отрезков линий *** }

procedure LineTo (X, Y : integer); – линия из текущей точки в (X, Y);

procedure LineRel (Dx, Dy : integer); – линия из текущей точки в точку, смещенную на (Dx, Dy);

procedure MoveTo (X, Y : integer); – переход в точку (X, Y);

procedure MoveRel (Dx, Dy : integer); – переход из текущей точки в точку, смещенную на (Dx,Dy);

procedure Line (x1, y1, x2, y2 : integer); – линия из точки (x1,y1) в точку (x2,y2);

procedure GetLineSettings (var LineInfo : LineSettingsType); – получить текущие настройки рисования линий;

procedure SetLineStyle (LineStyle : word;

Pattern : word;

Thickness : word); – задать текущие настройки рисования линий.

8) вывод и закраска контуров

{ *** многоугольники, их закраска и текстуры *** }

procedure Rectangle (x1, y1, x2, y2 : integer); – построить незакрашенный прямоугольник;

procedure Bar (x1, y1, x2, y2 : integer); – построить закрашенный прямоугольник;

procedure Bar3D (x1, y1, x2, y2 : integer; Depth : word; Top : boolean); – построить паралелепипед;

procedure DrawPoly (NumPoints : word; var PolyPoints); – построить контур многоугольника из NumPoints точек;

procedure FillPoly (NumPoints : word; var PolyPoints); – построить закрашенный многоугольник из NumPoints точек;

procedure GetFillSettings (var FillInfo : FillSettingsType); – получить текущие характеристики закраски;

procedure GetFillPattern (var FillPattern : FillPatternType); – получить текущие характеристики текстуры;

procedure SetFillStyle (Pattern : word; Color : word); – задать характеристики закраски;

procedure SetFillPattern (Pattern : FillPatternType; Color : word);– задать характеристики текстуры;

procedure FloodFill (X, Y : integer; Border : word); – залить область текущей закраской от заданной точки (X,Y) до границы, заданной цветом (Border).

9) окружности, эллипсы, дуги

{ *** построение окружностей, эллипсов и их частей *** }

procedure Arc (X, Y : integer; StAngle, EndAngle, Radius : word); – построение дуги окружности;

procedure GetArcCoords (var ArcCoords : ArcCoordsType); – получение параметров дуги окружности;

procedure Circle (X, Y : integer; Radius : word); – построение окружности заданного радиуса и центра;

procedure Ellipse (X, Y : integer;

StAngle, EndAngle : word;

XRadius, YRadius : word); – построение дуги эллипса;

procedure FillEllipse (X, Y : integer;

XRadius, YRadius : word); – построение закрашенного эллипса.

procedure GetAspectRatio (var Xasp, Yasp : word); – получение относительного разрешения по X и Y;

procedure SetAspectRatio (Xasp, Yasp : word); – задание относительного разрешения по X и Y;

procedure PieSlice (X, Y : integer; StAngle, EndAngle, Radius : word); – построение закрашенного сектора круга;

procedure Sector (X, Y : Integer;

StAngle, EndAngle,

XRadius, YRadius : word); – построение закрашенного сектора эллипса.

10) вывод текста

{ константы для процедур Set/GetTextStyle }

DefaultFont = 0; { шрифт по-умолчанию };

TriplexFont = 1; { "оттененный" шрифт };

SmallFont = 2; { мелкий шрифт };

SansSerifFont = 3; { шрифт "сан-сериф"};

GothicFont = 4; { готический шрифт };

HorizDir = 0; { текст слева–направо };

VertDir = 1; { текст снизу–вверх };

{ размещение текста относительно заданной точки }

LeftText = 0; { текст влево от точки };

CenterText = 1; { точка в центре текста };

RightText = 2; { текст вправо от точки };

BottomText = 0; { текст под точкой };

{ CenterText = 1; уже определено выше }

TopText = 2; { текст над точкой };

UserCharSize = 0; { размер шрифта задается программистом }.

{ признаки отсечения фигур при выходе за пределы окна }

ClipOn = true; – за границами окна фигура не видна;

ClipOff = false; – за границами окна фигура видна;

{ *** процедуры вывода текста *** }

procedure GetTextSettings (var TextInfo : TextSettingsType); – получить текущие настройки вывода текста;

procedure OutText (TextString : string); – вывести текст относительно текущей точки;

procedure OutTextXY (X, Y : integer; TextString : string); – вывести текст относительно точки (X,Y);

procedure SetTextJustify (Horiz, Vert : word); – установить параметры центровки (размещения) текста;

procedure SetTextStyle (Font, Direction : word; CharSize : word); – выбрать шрифт, его размер и направление вывода текста;

procedure SetUserCharSize (MultX, DivX, MultY, DivY : word); – задать размер шрифта программиста;

function TextHeight (TextString : string) : word; – получить текущую высоту строки текста;

function TextWidth (TextString : string) : word; – получить текущую ширину строки текста.

Разбор контрольного варианта № 31

Задание

Построить график функции Y=exp(X) для интервала X от –1 до 2, нанести на график размеченные оси координат и сделать подпись (название функции).

Дополнительные требования: график изобразить толстой штриховой линией красного цвета на белом фоне, координатные оси (толстая линия) и разметка (тонкая линия) – черного (темно-серого) цвета, подпись – синего цвета под графиком посередине.

Программу составить для EGA и VGA адаптеров (универсальную). Драйвер графического адаптера (с именем EGAVGA.BGI) находится в каталоге D:\TP6\BGI.

Условия, принятые из соображений дизайна:

График будет занимать 60% ширины и высоты экрана. Разметку проводим через 0.5 по Х и через 1.0 по Y. График рисуем процедурой LineTo, с шагом 0.2 по оси X.

Таблица идентификаторов

Таблица 28. Идентификаторы задачи 31-го варианта

Имя Тип Размер, (байт) Назначение
Graph_work Имя программы - Построение графика функции
Graph Имя модуля - Стандартные графические подпрограммы
Crt " - Стандартные подпрограммы работы с консолью
Print " - Стандартные подпрограммы работы с принтером
X Веществен. Текущее значение аргумента
Y " " Текущее значение функции
Xmin " " Минимальное значение аргумента
Xmax " " Максимальное значение аргумента
Ymin " " Минимальное значение функции
Ymax " " Максимальное значение функции
DeltaX " " Диапазон изменения аргумента
DeltaY " " Диапазон изменения функции
Dx " " Шаг аргумента для расчета графика функции
Dxs " " Шаг разметки оси Х
Dys " " Шаг разметки оси Y
Part " " Доля экрана, занимаемая графиком
Pole " " Размер полей вокруг графика в долях экрана
Mx " " Коэффициент пересчета Х в J
My " " Коэффициент пересчета Y в I
I Целое Горизонтальная координата экрана
J " " Вертикальная координата экрана
Imin " " Нижняя граница графика на экране
Imax " " Верхняя граница графика на экране
Jmin " " Левая граница графика на экране
Jmax " " Правая граница графика на экране
JAll " " Размер экрана по Х в пикселах
Iall " " Размер экрана по Y в пикселях
J0 " " Координата оси Y на экране
I0 " " Координата оси Х на экране
DeltaJ " " Размер рисунка по Х
DeltaI " " Размер рисунка по Y
Nx " " Шаг между рисками оси Х в пикселях
Ny " " Шаг между рисками оси Y в пикселях
Riska Строка Подпись текущей риски оси
GraphDrv Целое Тип графического драйвера
GraphMode " " Номер графического режима
Code беззнаковое " Код завершения процедуры инициализ. граф.
InitGraph Имя процедуры - Инициализация графического режима
GraphResult Имя функции - Возвращает код завершения граф. процедуры
ClearDevice Имя процедуры - Очистка экрана заданным цветом фона
Halt Имя процедуры - Останов (завершение) программы
SetBkColor Имя процедуры - Установка цвета фона
SetColor Имя процедуры - Установка цвета
SetLineStyle Имя процедуры - Установка типа линии
SetTextStyle Имя процедуры - Установка стиля текста
SetTextJustify Имя процедуры - Установка способа размещения текста
GetMaxX Имя функции - Возвращает размер экрана по Х
GetMaxY Имя функции - Возвращает размер экрана по Y
Round Имя функции - Округляет вещественный аргумент в целое
MoveTo Имя процедуры - Переход в заданную точку экрана
LineTo Имя процедуры - Проведение отрезка в заданную точку
Line Имя процедуры - Проведение отрезка
OutTextXY Имя процедуры - Вывод текста
Str Имя процедуры - Преобразование числа в строку с его изображен.
KeyPressed Имя функции - Возвращает TRUE, если нажата клавиша
CloseGraph Имя процедуры - Закрытие графического режима
Pr Имя процедуры - Копирование графического экрана на принтер

Алгоритм

1.Задание констант, стандартных значений;

2.Ввод исходных данных;

3.Печать исходных данных;

4.Расчет характеристик функций;

5.Открытие графики с проверкой правильности срабатывания;

6.Настройка фона;

7.Расчет параметров графика на экране;

8.Расчет масштабных коэффициентов перехода от X к J и от Y к I;

9.Построение графика функции:

9.1.Задание характеристик линии;

9.2.Начальная точка графика;

9.3.Цикл расчета экранных координат графика (X->J, X->Y->I) и проведения отрезков;

10.Построение осей координат:

10.1.Задание характеристик линии;

10.2.Построение осей;

11.Разметка осей:

11.1.Задание характеристик линии;

11.2.Характеристики шрифта для подписи значений;

11.3.Цикл проведения разметки оси X, риски вверх от оси, по 10 пикселов:

11.3.1. от начала координат – вправо;

11.3.1. от начала координат – влево;

11.4. Цикл проведения разметки оси Y, риски вправо от оси, по 10 пикселов:

11.4.1.от начала координат – вверх;

11.4.2.от начала координат - вниз (Для данной функции ниже оси Х разметка не нужна);

12.Подпись графика:

12.1.Характеристики шрифта, цвет;

12.2.Вывод подписи;

13.Задержка графика на экране;

14.Вывод графика на печать - только если подключен принтер;

15.Закрытие графического режима.

           
  Стандартный модуль работы с графическим экраном Graph - student2.ru   Стандартный модуль работы с графическим экраном Graph - student2.ru   Стандартный модуль работы с графическим экраном Graph - student2.ru
 
 

Блок-схема алгоритма

Стандартный модуль работы с графическим экраном Graph - student2.ru Стандартный модуль работы с графическим экраном Graph - student2.ru

           
  Стандартный модуль работы с графическим экраном Graph - student2.ru   Стандартный модуль работы с графическим экраном Graph - student2.ru
    Стандартный модуль работы с графическим экраном Graph - student2.ru
 

Текст программы

Program Graph_work;

{ Программа Лабораторной работы N 8.

Вариант N 31.

Построение графика функции.

А.Я.Умненькая, ст. гр. Я-007 }

Uses Graph,Crt,Print; {Print – только при наличии принтера для печати графика с экрана на бумагу }

Var

X,Y, { текущие значения переменных Х и Y }

Xmin,Xmax,{минимальное и максимальное значения Х на графике}

Ymin,Ymax,{минимальное и максимальное значения Y на графике}

DeltaX,DeltaY,{диапазоны изменения X и Y в пределах рисунка}

Dx, { шаг построения графика по Х }

Dxs,Dys, { Шаги разметки осей по Х и по Y }

Part,Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }

Mx,My {Коэффициенты пересчета Х в J и Y в I}

: real;

Imin,Imax, {координаты экрана, соответствующие Ymin и Ymax}

Jmin,Jmax, {координаты экрана, соответствующие Xmin и Xmax}

J,I, {текущие значения переменных координат экрана }

JAll,IAll, {Максимальные размеры экрана (в пикселях) по X,Y}

J0,I0, {Координаты на экране точки пересечения осей графика}

DeltaJ,DeltaI,{Экранные размеры рисунка по Х и Y в пикселях}

Nx,Ny {Шаги разметки осей Х и Y в пикселях }

: integer;

Riska : String[5]; {Строка для вывода чисел у рисок осей}

GraphDrv, {Тип графического драйвера }

GraphMode: integer; {Устанавливаемый графический режим}

Code: word; {Код завершения инициализации графики }

BEGIN { Начало программы }

{1.Задание констант, стандартных значений }

Xmin:=-1.0; Xmax:=2.0;

Dxs:=0.5; Dys:=1.0;

Part:=0.6; Dx:=0.2;

{2.Ввод исходных данных - в примере не используем}

{3.Печать исходных данных - в примере не используем}

{4.Расчет характеристик функций }

DeltaX:=Xmax-Xmin;

Ymin:=exp(Xmin);

Ymax:=exp(Xmax);

if Ymin>0 then Ymin:=0;

if Ymax<0 then Ymax:=0;

DeltaX:=Xmax-Xmin;

DeltaY:=Ymax-Ymin;

{5.Открытие графики с проверкой правильности срабатывания}

GraphDrv:=0; {пусть определяет режим сам }

InitGraph(GraphDrv,GraphMode,'D:\TP6\BGI');

Code:=GraphResult;

if Code<>0 then {если завершение с кодом не 0 - закончить программу}

Begin

writeln('Ошибка открытия графики с кодом: ',Code);

Halt; { Останов программы }

End;

{6.Настройка фона}

SetBkColor(15); {Фон белый }

ClearDevice; {Очистка экрана}

{7.Расчет параметров графика на экране}

JAll:=GetMaxX;

IAll:=GetMaxY;

Pole:=(1.0-Part)/2.0;

Jmin:=Round(Pole*JAll);

Jmax:=Round((1.0-Pole)*JAll);

Imin:=Round((1.0-Pole)*IAll);

Imax:=Round(Pole*IAll); { Imin > Imax !!! }

DeltaJ:=Jmax-Jmin;

DeltaI:=Imax-Imin;

{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}

Mx:=DeltaJ/DeltaX;

My:=DeltaI/DeltaY;

{9.Построение графика функции}

{9.1.Задание характеристик линии}

SetColor(4); { цвет красный }

SetLineStyle(3,0,3); { штриховая толстая }

{9.2.Начальная точка графика}

Nx:=Round(Dxs*Mx);

Ny:=Round(Dys*My); { Шаг разметки по Y - отрицательный }

J:=Jmin;

I:= Imin+Round((exp(Xmin)-Ymin)*My);

MoveTo (J,I);

{9.3.Цикл расчета экранных координат графика (X->J, X->Y->I) и проведения отрезков}

X:=0;

While X<=Xmax do

Begin

X:=X+Dx;

Y:=exp(X);

J:=Jmin+Round((X-Xmin)*Mx);

I:=Imin+Round((Y-Ymin)*My);

LineTo(J,I);

End;

{10.Построение осей 10.1.Задание характеристик линии }

SetColor(8); { цвет темно-серый }

SetLineStyle(0,0,3); { сплошная толстая }

{10.2.Построение осей }

J0:=Jmin+Round((0-Xmin)*Mx);

I0:=Imin+Round((0-Ymin)*My);

Line(J0,Imin,J0,Imax); {Построение оси Y (где X=0)}

Line(Jmin,I0,Jmax,I0); {Построение оси Х (где Y=0)}

{11.Разметка осей 11.1.Задание характеристик линии }

SetLineStyle(0,0,0); { сплошная тонкая }

{11.2.Характеристики шрифта для подписи значений }

SetTextStyle(0,0,0); { шрифт стандартный, подпись горизонтальна }

SetTextJustify(1,2); {Размещение текста симметрично, относительно заданной точки по горизонтали и ниже точки по вертикали}

{11.3.Цикл проведения разметки оси X, риски вверх от оси, по 10 пикселов }

J:=J0;

X:=0;

while J<=Jmax+1 do {от начала координат - вправо }

begin

Line(J,I0,J,I0-10);

Str(X:3:1,Riska);

OutTextXY(J,I0+5,Riska);

X:=X+Dxs;

J:=Jmin+Round((X-Xmin)*Mx);

end;

J:=J0;

X:=0;

while J>=Jmin do {от начала координат - влево }

begin

Line(J,I0,J,I0-10);

Str(X:3:1,Riska);

OutTextXY(J,I0+5,Riska);

X:=X-Dxs;

J:=J-Nx;

end;

{11.4.Цикл проведения разметки оси Y, риски вправо от оси, по 10 пикселов }

SetTextJustify(2,1); {Размещение текста симметрично, относительно заданной точки по вертикали и левее точки по горизонтали }

I:=I0;

Y:=0;

while I>=Imax do {от начала координат - вверх }

begin

Line(J0,I,J0+10,I);

Str(Y:3:1,Riska);

OutTextXY(J0-10,I,Riska);

Y:=Y+Dxs;

I:=I+Ny;

end;

{ Для данной функции ниже оси Х разметка не нужна}

I:=I0;

while I<=Imin do

begin

Line(J0,I,J0+10,I);

I:=I-Ny;

end;

{12.Подпись графика}

{12.1.Характеристики шрифта, цвет }

SetColor(1); { цвет синий }

SetTextJustify(1,1); {Размещение текста симметрично, относительно заданной точки по горизонтали и по вертикали}

{12.2.Вывод подписи }

I:=Round(IAll*(1-Pole/2)); {середина нижнего поля}

OutTextXY(JAll div 2,I,'График функции Y = exp(X)');

{13.Задержка графика на экране }

while Not KeyPressed do;

{14. Вывод графика на печать (на принтер) - только если он подключен }

Pr;

CloseGraph; {14.Закрытие графического режима }

END.

Стандартный модуль работы с графическим экраном Graph - student2.ru

Рисунок 10. Результат работы программы 31-го варианта

Разбор контрольного варианта № 32

Задание

Построить график кривой, заданной параметрически: X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t) для интервала t от 0 до 2π, нанести на график размеченные оси координат и сделать подпись.

Дополнительные требования: график изобразить тонкой сплошной линией красного цвета на белом фоне, координатные оси (толстая линия) и разметка (тонкая линия) – черного (темно-серого) цвета, подпись – синего цвета под графиком посередине.

Программу составить для EGA и VGA адаптеров (универсальную). Драйвер графического адаптера (с именем EGAVGA.BGI) находится в каталоге D:\TP6\BGI.

Условия, принятые из соображений дизайна:

График будет занимать 60% ширины и высоты экрана. Разметку проводим через 0.5 по Х и Y. График рисуем процедурой LineTo, для 400 точек.

Program Graph_work2;

{ Программа Лабораторной работы N 8

Вариант N 32.

Построение кривой, заданной параметрически.

А.Я.Умненькая, ст. гр. Я-007 }

Uses Graph,Crt; { Print - только при наличии принтера для печати графика с экрана на бумагу }

TYPE

mas=array[0..400] of real;

Var

X,Y:mas; { текущие значения переменных Х и Y }

Xmin,Xmax,t,tmin,tmax, { минимальное и максимальное значения Х на графике }

Ymin,Ymax, { минимальное и максимальное значения Y на графике }

DeltaX,DeltaY, { диапазоны изменения X и Y в пределах рисунка }

Dt,R, { шаг построения графика по t }

Xj,Yi,

Dxs,Dys, { Шаги разметки осей по Х и по Y }

Part,Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }

Mx,My {Коэффициенты пересчета Х в J и Y в I}

: real;

Imin,Imax, { координаты экрана, соответствующие Ymin и Ymax }

Jmin,Jmax, { координаты экрана, соответствующие Xmin и Xmax }

J,I,N,k, { текущие значения переменных координат экрана }

JAll,IAll, {Максимальные размеры экрана (в пикселях) по X и Y}

J0,I0, {Координаты на экране точки пересечения осей графика }

DeltaJ,DeltaI { Экранные размеры рисунка по Х и Y в пикселях}

: integer;

Riska : String[5]; { Строка для вывода чисел у рисок осей }

GraphDrv, { Тип графического драйвера }

GraphMode: integer;{ Устанавливаемый графический режим }

Code: word; { Код завершения инициализации графики }

BEGIN { Начало программы }

{1.Задание констант, стандартных значений }

tmin:=0; tmax:=2.0*Pi;

Dxs:=0.5; Dys:=0.5;

Part:=0.6; N:=401;

{4.Расчет характеристик функций }

Dt:=(tmax-tmin)/(N-1);

Xmax:=-100;

Xmin:=100;

Ymax:=-100;

Ymin:=100;

For k:=0 to N-1 do

begin

t:=tmin+Dt*k;

R:=2.0+0.5*cos(8.0*t);

X[k]:=R*cos(t);

Y[k]:=R*sin(t);

if X[k]>Xmax then Xmax:=X[k];

if X[k]<Xmin then Xmin:=X[k];

if Y[k]>Ymax then Ymax:=Y[k];

if Y[k]<Ymin then Ymin:=Y[k];

end;

DeltaX:=Xmax-Xmin;

DeltaY:=Ymax-Ymin;

{5.Открытие графики с проверкой правильности срабатывания}

GraphDrv:=0; {пусть определяет режим сам }

InitGraph(GraphDrv,GraphMode,'C:\voronov\STUD\TP\BGI');

Code:=GraphResult;

if Code<>0 then {если завершение с кодом не 0 - закончить программу}

Begin

writeln('Ошибка открытия графики с кодом: ',Code);

Halt; { Останов программы }

End;

{6.Настройка фона}

SetBkColor(15); {Фон белый }

ClearDevice; {Очистка экрана}

{7.Расчет параметров графика на экране}

JAll:=GetMaxX;

IAll:=GetMaxY;

Pole:=(1.0-Part)/2.0;

Jmin:=Round(Pole*JAll);

Jmax:=Round((1.0-Pole)*JAll);

Imin:=Round((1.0-Pole)*IAll);

Imax:=Round(Pole*IAll); { Imin > Imax !!! }

DeltaJ:=Jmax-Jmin;

DeltaI:=Imax-Imin;

{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}

Mx:=DeltaJ/DeltaX;

My:=DeltaI/DeltaY;

{9.Построение графика функции}

{9.1.Задание характеристик линии}

SetColor(4); { цвет красный }

SetLineStyle(0,0,2);

{9.2.Начальная точка графика}

J:=Jmin+Round((X[0]-Xmin)*Mx);

I:=Imin+Round((Y[0]-Ymin)*My);

MoveTo (J,I);

{9.3.Цикл расчета экранных координат графика (X->J, Y->I) и проведения отрезков}

for k:=1 to N-1 do

Begin

J:=Jmin+Round((X[k]-Xmin)*Mx);

I:=Imin+Round((Y[k]-Ymin)*My);

LineTo(J,I);

End;

{10.Построение осей координат }

SetColor(8); { цвет темно-серый }

SetLineStyle(0,0,3); { сплошная толстая }

J0:=Jmin+Round((0-Xmin)*Mx);

I0:=Imin+Round((0-Ymin)*My);

Line(J0,Imin,J0,Imax); {Построение оси Y (где X=0)}

Line(Jmin,I0,Jmax,I0); {Построение оси Х (где Y=0)}

{11.Разметка осей}

SetLineStyle(0,0,0); { сплошная тонкая }

SetTextStyle(0,0,0); { шрифт стандартный, подпись горизонтальна }

SetTextJustify(1,2); {Размещение текста симметрично, относительно заданной

точки по горизонтали и ниже точки по вертикали}

J:=J0;

Xj:=0;

while J<=Jmax+1 do {от начала координат - вправо }

begin

Line(J,Imin,J,Imax);

Str(Xj:3:1,Riska);

OutTextXY(J,I0+5,Riska);

Xj:=Xj+Dxs;

J:=Jmin+Round((Xj-Xmin)*Mx);

end;

J:=J0;

Xj:=0;

while J>=Jmin do {от начала координат - влево }

begin

Line(J,Imin,J,Imax);

Str(Xj:3:1,Riska);

OutTextXY(J,I0+5,Riska);

Xj:=Xj-Dxs;

J:=Jmin+Round((Xj-Xmin)*Mx);

end;

SetTextJustify(2,1); {Размещение текста симметрично, относительно заданной

точки по вертикали и левее точки по горизонтали }

I:=I0;

Yi:=0;

while I>=Imax-1 do {от начала координат - вверх }

begin

Line(Jmin,I,Jmax,I);

Str(Yi:3:1,Riska);

OutTextXY(J0-10,I,Riska);

Yi:=Yi+Dxs;

I:=Imin+Round((Yi-Ymin)*My);

end;

I:=I0;

Yi:=0;

while I<=Imin do {от начала координат - вниз }

begin

Line(Jmin,I,Jmax,I);

Str(Yi:3:1,Riska);

OutTextXY(J0-10,I,Riska);

Yi:=Yi-Dxs;

I:=Imin+Round((Yi-Ymin)*My);

end;

{12.Подпись графика}

SetColor(1); { цвет синий }

SetTextJustify(1,1); {Размещение текста симметрично, относительно заданной

точки по горизонтали и по вертикали}

I:=Round(IAll*(1-Pole/2)); {середина нижнего поля}

OutTextXY(JAll div 2,I,'X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t)');

{13.Задержка графика на экране }

while Not KeyPressed do;

{14. Вывод графика на печать (на принтер) - только если он подключен }

{Pr;}

{14.Закрытие графического режима }

CloseGraph;

END.

Стандартный модуль работы с графическим экраном Graph - student2.ru

Рисунок 11. Результат работы программы 32-го варианта

Варианты заданий

Таблица 29. Варианты заданий лабораторной работы N9

Наши рекомендации