Стандартный модуль работы с графическим экраном 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 | " | - | Стандартные подпрограммы работы с консолью |
" | - | Стандартные подпрограммы работы с принтером | |
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.Закрытие графического режима.
![]() | ![]() | ![]() | |||
Блок-схема алгоритма
![]() | ![]() | ||||
![]() | |||||
Текст программы
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.
Рисунок 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.
Рисунок 11. Результат работы программы 32-го варианта
Варианты заданий
Таблица 29. Варианты заданий лабораторной работы N9