Графические средства Turbo Pascal 7.0

Turbo Pascal 7.0 предоставляет возможность программисту выводить на экран монитора различные геометрические изображения: от простейших — точек, линий, кривых, окружностей, прямоугольников — до сложных построений на плоскости и в пространстве, статических и динамических. Для этого необходимо работу видеосистемы компьютера перевести в графический режим.

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

На рис. 4.16 показан экран монитора в графическом режиме и координаты точек для адаптера видеосистемы SVGA. Этот адаптер (приспособление) позволяет вывести на экран 1024 х 768 точек. Самая первая точка в левом верхнем углу экрана имеет координаты (0, 0). Самая нижняя — в правом нижнем — координаты (1023, 767). Значения координат точек возрастают слева направо и вниз.

Изображение экрана монитора для адаптера SVGA

Рис. 4.16. Изображение экрана монитора для адаптера SVGA

X

Y

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

Каждый графический адаптер может работать в нескольких режимах, а управление адаптером и его режимами осуществляется специальной программой — драйвером. Программы-драйверы разработаны фирмой Borland для каждого вида адаптера и хранятся в виде файлов с расширением .bgi (Borland Graphics Interface) в каталоге BGI на диске компьютера.

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

Uses

Graph;

Далее необходимо непосредственно перевести видеосистему в режим работы с геометрическими изображениями. Для этого предусмотрена процедура инициализации графического режима InitGraph (GraphDriver, GraphMode, PathtoDriver).

В этой процедуре параметр Graph Driver — графический драйвер, определяется видом адаптера, используемого в системе. Если это SVGA, то Graph Driver имеет значение VGA. Для другого адаптера оно будет иным.

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

Наконец, параметр Pathto Driver — путь к драйверу — определяет путь к каталогу, где находится файл с программой-драйвером. Обычно он обозначается так: C: pgi или E: pgi.

При переводе видеосистемы компьютера в графический режим с помощью процедуры InitGraph необходимо указать ее фактические параметры. В некоторых случаях это вызывает определенные затруднения: необходимо знать обозначение адаптера и кодировку того или иного режима его работы. Чтобы упростить эту ситуацию, разработчиками модуля Graph предусмотрена возможность установки режима самоопределения указанных параметров. Для этого параметру Graph Driver присваивается значение Detect. В результате компьютер определяет тот адаптер, который на нем установлен, и с максимальным его разрешением. Параметры возвращаются процедурой Detect Graph (Drv, Md), где Drv, Md — переменные типа integer, первая из которых определяет тип адаптера, а вторая — максимальное его разрешение.

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

Таблица 4.5. Коды ошибок и их причины

Значение кода

Причина ошибки

-2

Нет графического адаптера

-3

Не найден файл драйвера

-4

Ошибка в коде файла

-5

Не хватает памяти для загрузки файла

-10

Невозможный режим для выбранного драйвера

-15

Нет такого драйвера

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

Program Init; {Инициализация графического режима}

Uses

Crt, Graph;

Var

Gr: integer; {Параметр GraphDriver}

GrMd: integer; {Параметр GraphMode}

Error: integer; {Ошибка инициализации}

Begin

Gr:=Detect; {Установка режима самоопределения}

Init Graph (Gr, GrMd, ' C: pgi '); {Инициализация}

{графического режима}

Error:= Graph Result;

If ErrorogrOk Then

Begin

Writeln (GrahErrorMsg(Error));

Halt;

End;

DetectGraph (Drv, Md);

Writeln ('Адаптер', Drv: 10, 'режим' Md:10);

Readln;

CloseGraph;

End.

В этой программе предусмотрен режим самоопределения адаптера системы и максимального его разрешения. Кроме этого, если ошибка ErrorogrOk (Graph O'key), на экран функцией GrahErrorMsg (Error) выводится код ошибки и оператор Halt передает управление ОС. После этого требуется анализ неудачной инициализации, устранение причины и повторный запуск программы.

Если же ошибок инициализации нет, на экран дисплея выводится сообщение об используемом адаптере и его режиме, и программа ждет ожидания нажатия клавиши Enter. Возврат в стандартный текстовый режим работы видеосистемы осуществляется процедурой CloseGraph.

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

В модуле Graph существуют функции GetX, GetY, обратившись к которым можно получить координаты той точки, где в данный момент находится указатель вывода. Например, процедура Writeln ('Х=', GetX, 'Y=' GetY) выведет на экран координаты X, Y.

Переместить указатель в заданную точку (X, Y) можно, обратившись к процедуре MoveTo(X,Y). Например, выполнение процедуры MoveTo(500,300) перемещает указатель вывода в точку с координатами X = 500, Y = 300.

В модуле Graph имеется процедура, которая может перемещать указатель вывода относительно данного положения на заданное число пикселей (точек). Она записывается так MoveReal(AX, AY). Тогда, если указатель находится в точке (X, 4), выполнение указанной процедуры переместит его в точку с координатами Х+АХ, Y+AY. Например, пусть указатель находится в точке (450, 220), тогда выполнение MoveReal (100, 90) приведет его в точку (550, 300), а выполнение MoveReal (-100, 40) установит его в точку (350, 250).

Построение различных графических изображений — чертежей, схем, движущихся объектов — осуществляется на основе вывода простейших элементов — точек, линий, дуг, окружностей и других геометрических фигур. Эти элементы принято называть графическими примитивами. При этом вывод может осуществляться одним из 16 цветов (см. табл. 4.2, п. 3). Для указания цвета вывода используется процедура SetColor (цвет), где цвет — константа типа Black, Blue и т. д. или номер цвета 0, 1, ..., 15, указанные в табл. 4.2. Например, выполнение процедуры SetColor (5) устанавливает, что текущим цветом вывода будет сиреневый цвет. Для изменения цвета вывода изображений необходимо указать процедуру с другим цветом, например SetColor (14) определяет вывод изображения желтым цветом. Таким образом, меняя номера в процедурах, можно добиться вывода на экран разноцветных изображений на различном фоне.

Простейший графический примитив — цветная точка. Для ее вывода на экран применяется процедура PutPixel (X,Y, Цвет), где X, У — координаты точки, а Цвет — константа цвета согласно в табл. 4.2. Например, PutPixel(400,300, Blue) выведет на экран синюю точку с координатами Х= 400, У= 300.

Приведем пример программы, которая усеивает экран монитора заданным числом точек со случайными координатами и случайными цветами.

Program Pixel; {Вывод разноцветных точек}

Uses

Crt, Graph;

Var

Gr, GrMd, Error: integer;

X,Y,S,i: integer;

Begin

Gr:=Detect; InitGraph (Gr, GrMd, ' C: pgi ');

Error:= GraphResult;

If ErrorogrOk Then

Begin

Writeln (GrahErrorMsg(Error));

Halt;

End;

Randomize;

For i=l To 100000 do

Begin

X:=Int(Random* 1023);

Y:=Int(Random*767);

S:=Int(Random*15);

PutPixel (X,Y,S);

End;

CloseGraph;

End.

Для вычерчивания линий в модуле Graph имеется две процедуры: Line (X,,Y„ X2,Y2), где (X,,Y,) — точка начала линии, a (X2,Y2) — точка ее конца и Line ТО (X,Y). Вторая процедура проводит линию от текущей точки вывода в точку с заданными координатами X, Y. В качестве примера приведем последовательность инструкций построения ромба.

MoveTo (10,30);

LineTo (40,10);

LineTo (70,30);

LineTo (40,50);

LineTo (10,30);

Рекомендуем проверить правильность построения на чертеже.

В модуле Graph предусмотрена возможность вывода линий разной толщины и формы. Это осуществляется с помощью процедуры SetLineStyle (Тип линии, Образец, Толщина). Тип линии берется из табл. 4.6.

Образец задается двузначным шестнадцатеричным числом, если тип линии задает программист. Толщина линии может быть обычной, тогда указывается константа Norm Wight, или линия может быть утолщенной, тогда указывается константа ThickWight.

Таблица 4.6. Толщина и форма линии

Константа

Тип линии

SolidLn

Сплошная, непрерывная

DottedLn

Пунктирная, с постоянной длиной штрихов

CenterLn

Штрих-пунктирная

DashedLn

Пунктирная с большей длиной штрихов

User BitLn

Определяемая программистом

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

SetBkColor (Blue); {Установка синего фона экрана}

SetColor (Yellow); {Желтый цвет выводимой линии}

MoveTo (0,1); {Перевод указателя вывода в начало линии} SetLineStyle (Solid, t, ThicWigth); {Установка типа линии}

LineTo (1023,1); {Вывод горизонтальной линии}

SetColor (Light Red); {Алый цвет выводимой линии}

MoveTo (0,99); {Перевод указателя вывода в начало линии} SetLineStyle (DottedLn, t, NormWigth); {Тип выводимой линии} LineTo (1023,99); {Вывод горизонтальной линии}

SetColor (White); {Белый цвет выводимой линии}

MoveTo (0,199); {Перевод указателя вывода в начало линии} SetLineStyle (CenterLn, t, ThicWigth); {Тип выводимой линии}

LineTo (1023,199); {Вывод горизонтальной линии}

Модуль Graph содержит ряд процедур, позволяющих вычерчивать на экране окружности и их дуги, эллипсы и их дуги, прямоугольники и параллелепипеды.

Для вывода на экран окружности используется процедура Circle (X,Y,R), где X, Y — координаты центра окружности, a R — ее радиус в пикселях. Вывод дуги окружности осуществляется процедурой Arc (X,Y, BegA, EndA,R), где BegA (Begin A) — начало и конец дуги, отсчитываемые в градусах против часовой стрелки.

Вывод эллипса или его дуги выполняется процедурой Ellips (X,Y, BegA, EndA, RX, RY), где X, Y — координаты центра эллипса, ЯХ — радиус по оси X, КУ — радиус по оси У, Е^А, ЕпбА — начало и конец дуги, отсчитываемые против часовой стрелки. Следует отметить, что при равенстве радиусов ЯХ= ЯУ эта процедура выводит дугу окружности или полную окружность.

На рис. 4.17 изображены окружность и эллипс и указаны правила отсчета дуг.

Отсчет углов дуг окружности (а) и эллипса (б)

Рис. 4.17. Отсчет углов дуг окружности (а) и эллипса (б)

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

Для центра окружности определим координаты Y=240, У= 380, для центра эллипса — координаты Х=740, У= 380. Таким образом, выводимые фигуры должны оказаться на одной горизонтали Y= 380. Причем, слева окружность, справа — эллипс.

Максимальный радиус окружности R примем равным 200 пикселям. Максимальные радиусы эллипса определим как RX= 200, RY= 160 пикселей. Тогда фрагмент программы вывода может быть таким:

Х:=240; Y:=380; ХЕ:=740, R:=200; RX:=200; RY:=150;

SetBkColor (Blue); {Голубой экран}

SetColor (Magenta); {Сиреневые линии}

While R > 40 do Begin

Circle (X,Y,R); {Вывод окружности}

Ellipse (XE, Y, 0, 360, RX, RY); {Вывод эллипса}

R:=R-20; {Изменение радиуса окружности}

RX:=RX-20; RY:=RY-20; {Изменение радиусов эллипса}

End;

End.

Для вычерчивания прямоугольников используется процедура Rectangle (X,,Y„ X2,Y2), где (Y,, Y,) — координаты верхнего левого угла прямоугольника, а 22) — координаты правого нижнего его угла. Например, процедура Rectangle(0,0,GetMaxX, GetMaxY) вычерчивает на экране рамку максимальных размеров, определяемых функциями GetMaxX, GetMaxY.

Составим фрагмент программы, которая выводит на экран ряд размещенных друг в друге прямоугольников (рис. 4.18).

О 511 1023

Размещенные друг в друге прямоугольники

Рис. 4.18. Размещенные друг в друге прямоугольники

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

нии уравнения линии, проходящей через две точки

Y -У

-Y,

X-X

Х2 -X,

1 . Применительно к нашему случаю это уравнение запи-Y-0 X-0

. Таким образом, получа-

ШРТГЯ тя с _ — _

GetMaxY - 0 Ое1МахХ - 0

У GetMaxY „ GetMaxY ~

ем —=-, или У=Х--. Теперь, задавая X,

X Се1МахХ Се1МахХ

можно получить ряд значений V Выберем в качестве значений X

такую последовательность: 0, 32, 64, 128, 256. Тогда фрагмент программы может быть представлен так:

Begin

SetBkColor (Blue); {Голубой экран}

SetColor (Red); {Красные линии} a:=GetMaxY; {Максим, пиксель по вертикали} b:=GetMaxX; {Максим, пиксель по горизонтали} z:=a/b;

Rectangle (0,0,Ь,а); {Прямоугольник макс, размеров} х:=32;

Repeat

Y:=x*z;

Rectangle (X,Y,b-X,a-Y);

X:=2*x;

Until X>256;

End.

Кроме незакрашенных фигур, модуль Graph предоставляет возможность выводить фигуры, закрашенные разным цветом с разными узорами. Закраска фигуры и ее узор задаются процедурой SetFileStyle (Узор Цвет), где Узор — вид закраски, иногда говорят — заливки фигуры, а Цвет — один из 16 цветов (табл. 4.2).

В качестве узоров используются виды, представленные в табл. 4.7.

Процедуры, дающие возможность закрашивать фигуры, следующие: Bar (X,,Y,, X2,Y2) — прямоугольник, где Xl,Y[ координаты левого верхнего угла, а Х22 координаты правого нижнего угла; Bar3D(X„Y„ X2,Y2, Глубина, Верхняя граница) — параллелепипед, где X,, У,, Х22 то же, что и для прямоугольника, Глубина — расстояние между передней и задней гранями параллелепипеда, а Верхняя граница определяет, нужно ли изображать верхнюю границу задней его грани. Если True — то нужно, если False — нет; PieSlice(X, Y, BegA, EndA, R) сектор круга или круг, если BegA = 0, a EndA = 360; Sector(X,Y,BegA,EndA,RX,RY) — сектор эллипса или эллипс, если BegA = 0, a EndA = 360.

Приведем фрагмент программы, иллюстрирующей заполнение фигур разным цветом и узорами.

Begin

ClrScr;

SetBkColor (Green); {Зеленый фон}

Таблица 4.7. Заливка фигур

Константа

Код

Виды заливки

Empty Fill

0

Заливка цветом фона

SolidFill

1

Сплошная заливка заданным цветом

LineFill

2

Заполнение линиями

LtSlash Fill

3

Заполнение под углом 45°

SlashFill

4

Заполнение под углом 45° утолщенными

BrSlash Fill

5

Заполнение под углом 45° утолщенными

LtBrSlashFill

6

Заполнение под углом 45°

ШШШШ

HatchFill

7

Заполнение ++++++

XhatchFill

8

Заполнение ХХХХХ

CenterofFill

9

Заполнение в прямоугольную клетку

WideofFill

10

Заполнение редкими точками

ClosedofFill

11

Заполнение частыми точками

UserFill

12

Узор определяется пользователем

SetFileStyle (1, Red); {Сплошная заливка красным цветом} Ваг (10,10,1000,750); {Прямоугольник}

Readln;

ClrScr;

SetFileStyle (1, Yellow); {Сплошная заливка желтым цветом} Bar3D (20,20,500,250,100,1); {Параллелепипед}

Readln;

ClrScr;

SetFileStyle (3, DarkGray); {Заполнение под углом 45° PieSlice (500,250,9,180,400); {Сектор круга}

Readln;

SetFileStyle (11, White); {Заполнение частыми точками} Sector (500,250,180,360,200,150); {Сектор эллипса}

Readln;

ClrScr;

End.

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

Процедура OutText (Текст) позволяет вывести строку с той позиции, в которой в данный момент находится указатель вывода. После выполнения процедуры указатель перемещается в правый верхний угол прямоугольной области, куда был выведен текст. Например, если выполнена процедура Out Text (Turbo Pascal'), указатель будет расположен на первом после буквы 1 пикселе — вверху.

Процедура OutTextXY (X,Y,Текст) выводит строку, начиная с точки (X,Y). Например, после выполнения процедуры OutTextXY(50,10, 'Delpfi') слово Delpfi будет выведено в строке 50 с 10-го пикселя.

При выводе текста этими процедурами программисту предоставлена возможность указать шрифт, его размер и направление вывода. Для этого предназначена процедура SetTextStyle (Шрифт, Ориентация, Размер). Названия и коды шрифтов можно взять из табл. 4.8.

Таблица 4.8. Разновидности шрифтов

Код шрифта

Название шрифта

1

Утроенный шрифт — Trip.ehr

2

Уменьшенный шрифт — SmallFont

3

Прямой шрифт — SensSeriFont

4

Готический шрифт — Gothic.ehr

5

Рукописный шрифт — Scri.ehr

6

Одноштриховый шрифт — Simp.ehr

7

Наклонный шрифт — Tscr.chr

8

Шрифт типа Times Roman — Lcom.chr

9

Шрифт типа 6 увеличенный Euro.ehr

10

Крупный двухштриховый шрифт Bold.ehr

Параметр «Ориентация» имеет два значения: НопгОк = 0 и УеЮц = 1. Когда в процедуре указывается первый параметр или константа 0, вывод осуществляется в естественном порядке, т. е. слева направо. Когда же указывается VerDir или 1, вывод текста осуществляется снизу вверх.

Параметр «Размер» определяет размер выводимых символов. Он может принимать значение от 0 до 10.

В качестве примера приведем фрагмент программы использования различных шрифтов [35].

Begin

ClrScr;

SetBkColor (Light Blue); {Голубой экран}

For i= 1 to 10 do {Цикл по видам шрифта}

Begin

SetTextStyle (i,0,0); {Очередной шрифт}

OutText XY(20,20+(i-l)*18, 'Example'); {Вывод}

Delay (3000); {Пауза на 3 с}

End;

Repeat {Повторять до нажатия любой клавиши}

Until KeyPressed; {Это бесконечный цикл}

End.

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

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

Рассмотрим фрагмент программы, демонстрирующей движение окружности по экрану от его левой границы к правой [36].

Begin

ClrScr;

Х:=0; Y:=380; R:=20; {Начальное положение окружности}

{и ее радиус}

Dx:=2; {Шаг перемещения окружности}

While х<1000 do

Begin

SetColor (Yellow); {Желтый цвет окружности}

Circle (X,Y,R); {Вывод окружности}

Delay (100); {Задержка окружности на экране}

SetColor (0); {Цвет стирания окружности}

Circle (X,Y,R); {Стирание окружности}

X:=X+DX; {Изменение центра окружности}

End;

End.

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

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

Рассмотрим более подробно, как выполняются перечисленные этапы.

Предположим, что для вывода графика будет использован весь экран и а, b — положительные числа. Тогда для построения графика перенос по оси У вправо не требуется: весь график будет расположен на интервале [0, GetMaxX]. Если в качестве величины подынтервала, делящего [а, b] на равные участки, принять число Ах так, что ХАх = b - а, то величину подынтервала в пикселях Арх, соответствующую Ах, можно найти из простой пропорции (b - а) Ах, (GetMaxX - 0) -> Арх, откуда

Арх =-. Вычисление Арх по существу представляет

b - а

собой масштабирование экрана и будет использоваться при нанесении координатной сетки. Принятая величина Ах также применяется для оцифрования делений оси X.

В том случае, когда а отрицательно, а b положительно, координатную ось У необходимо «сдвинуть» вправо на величину а. Когда же оба числа а, b отрицательные, координатная ось У должна проходить через точку GetMaxX.

Для масштабирования экрана по оси У необходимо предварительно на интервале [а, Ь] найти шаху(х) и min у(х). Если

max y(x) > GetMaxY, то положить max y(x) = GetMaxY и

min y(x) = min y(x) - max у - GetMaxY. Иными словами, вложить |max y(x) - min Xх)! B пределы экрана по вертикали.

Далее необходимо выяснить, смещать ли ось X или нет. Если таху(х) и miny(x) положительные, то необходимо, чтобы ось X проходила через точку GetMaxY. Если отрицательные, то переносить ее нет необходимости. Когда же указанные величины разных знаков, то ось х должна проходить через точку GetMaxY +1 miny(x)|.

Масштабирование по оси OY выполняется аналогично: GetmaxY • Ay

Apv =---. Величина Ay используется для оциф-

maxy(x) - miny(x)

рования делений по оси У, величина Дpv для нанесения коор-

динатной сетки.

Приведем фрагмент программы нанесения координатной сетки. Для известной функции у=/(х), заданной на интервале [а, Ь, выберем количество точек его деления п на равные от-

резки Ах, тогда Ах =

b - а

п

. Далее условимся, что сетку будем

наносить на весь экран. Тогда масштаб по оси X определяется

(

так: тх -

к

GetmaxY I b - а

. Откуда длина отрезка Ах в пикселях будет

у

Арх= тхАх. Таким образом, на графическом экране мы получили шаг сетки по оси X.

Для того чтобы получить величину такого шага по оси У, необходимо предварительно вычислить максимальное max у и минимальное min у значения функции у на [а, Ь]. Предположим, что эти величины найдены. Тогда, исходя из разности | max у - minyl, необходимо выбрать количество точек деления m

указанной величины на равные отрезки Ау и получить длину от-

1 шаху - тту

резка Ау =

ся так: ту =

т

GetmaxY

. Откуда масштаб по оси У определит-

max у - minyl

. Длина отрезка Ау в пикселях будет

Ару = ту • Ау.

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

Располагая значениями Арх, Apv, можно приступить к нанесению сетки. Для этого необходимо организовать два цикла: один по делениям оси X, другой — оси Y. В качестве примера взята функция у = 1,5- (Зх3 - 4.x2 + 5х) • sin(x), * е [-10, 10].

Program Setka; {Вывод координатной сетки}

Uses

Crt, Graph; {Подключение модулей}

Var

a,b: real; {Границы интервала изменения функции} х,у: real; {Точка интервала и значение функции f(x)} mx,my: real; {Масштабы по осям X,Y} lx,ly: integer; {Количество интервалов в пикселях} dx,dy: real; {Длины отрезков по осям} dpx,dpy: integer; {Длины отрезков в пикселях} шах х, min у: real; {Макс, и мин. значения f(x) на [а,Ь]} n,m: integer; {Количество точек деления интервала} х0,у0: integer; {Точки начала координат} sx,sy: integer; {Смещения по осям X,Y} k: real; {Числовое значение деления интервалов} z: integer; {Вспомогательная переменная} st: string; {Строковый образ числа}

Gr, GrMd: integer; {Формальные параметры инициации}

{графического режима}

Function f(x: real): real; {Объявление функции}

Begin

f:=1.5*(3*x*x*x-4*x*x+5*x)*Sin(x);

End;

Begin

Gr:=detect;

I nit (Gr, GrMd, 'C: pgi'); {Инициация графического режима}

If GraphResult <> grOk Then {Проверка правильности}

Begin

Writeln (GraphError Msg(Error)); {Вывод ошибки}

Halt; {Выход в ОС}

End;

Writeln ('Введите n'); Readln (n);

dx:=Abs(b-a)/n; mx:=GetMax/Abs(b-a);

dpx:=Round(mx*dx);

min y:=0; max y:=0;

x:=a;

While x < b do {Вычисление min y, max у }

Begin

Y=f(x);

If y

If y>max у Then max y=y; x:=x+dx;

End;

Writeln ('Введите m'); Readln (m); dy:=Abs(max y-min y)/m; my:=GetMaxY/Abs(max y-min x); dpy:=Round(my*dy);

SetBkColor(Light Blue); {Голубой экран}

SetColor (Black); {Черная сетка}

SetLineStyle (SolidLn,0,NormWight); {Сплошные линии}

{нормальной толщины}

z:=0;

While z < GetMax X do {Вывод вертикальных линий сетки}

Begin

Line (z,0,z,GetMaxY); z:=z+Apx;

End;

lx:=z;

z:=0;

While z < GetMax Y do {Вывод горизонтальных линий сетки}

Begin

Line (0,z,GetMax X, z); z:=z+dpy;

End;

ly:=z;

Положение осей координат графика функции, как было уже отмечено, определяется расположением интервалов [а, Ь], [min у, шах у].

По отношению к рассматриваемой функции интервал [а, b] по горизонтали симметричен относительно нуля. Поэтому вертикальную ось /можно провести на отметке /х/2. Предположим, что интервал [min у, max у] по вертикали также симметричен относительно нуля. Тогда горизонтальную ось X можно провести на отметке /у/2.

Теперь осталось оговорить правила оцифровки осей X, У.

Так как длины подынтервалов по осям X, У приняты равными 1, то очевидно, что вверх и вправо от начала координат кон-

цы интервалов необходимо отмечать числами 1, 2, 3. Вниз и влево от начала координат — числами -1, -2, -3. Условимся, что эти числа по горизонтали будем проставлять за каждой очередной меткой (рис. 4.19).

н-1— X

2 3

Рис. 4.19. Оцифровка осей координат

Y

Таким образом, для оцифровки осей координат необходимо организовать четыре цикла, в которых будут выводиться значения делений вправо-влево по оси X и вверх-вниз по оси У. Ниже приведен фрагмент программы вывода осей координат и их оцифровки.

хО:=ех div 2; {Начало} уО:=еу div 2; {Координат}

Set line Style (SolidLn,0,ThickWight); {Утолщенная сплошная линия} Line(x0,0,x0,GetMaxY); {Ось Y}

Line(0,y0,GetMaxX, уО); {Ось X}

SetTextStyle (Small Font, 0,0); {Шрифт строчный, горизонтальный,}

{Обычный}

z:=xO+Apx; sy:=y0+2; k:=l;

While z < (lx-dpx) do {Оцифрование вправо по оси X}

Begin

Str(k:3:l, st); {Преобразование числа в строчные}

{представления}

OutTextXY(z+2, Sy, st); {Вывод значения деления} z:=z+dpx; k:=k+l;

End;

z:=xO-Apx; k:=-l;

While z > dpx do {Оцифрование влево по оси X}

Begin

Str(k:4:l, st);

OutTextXY(z-8, Sy, st);

z:=z-dpx; k:=k-l;

End;

z:=yO-dpy; sx:=x0+2; k:=l;

While z > dpy do {Оцифрование по оси Y вверх}

Begin

Str(k:3:l, st)

OutTextY(Sx, z-2, st);

z:=z-dpy; k:=k+l;

End;

z:=yO+dpy; k:=-l;

While z < (ly-dpy) do {Оцифрование Y вниз}

Begin

Str(k:4:l, st)

OutTextXY(Sx, z-8, st); z:=z+dpy; k:=k-l;

End;

Теперь можно построить график. Исходя из того, что | b - а = 20, на единицу интервала приходится 52 пикселя. Чтобы кривая, изображающая график, была всюду плотной, выберем в качестве изменения аргумента х величину 0,05. Это составит примерно 2,5 пикселя. Выводимый график будет изображен коричневым цветом.

х:=а;

While х < b do Begin

y:=f(x);

Put Pixel (Round(x*mx), Round(y*my), Brown);

x:=x+0.05;

End;

End.

Безусловно, можно составить программу, в которой учитываются различные варианты размещения интервала [а, Ь] относительно оси Y, а интервала [max у, min у] относительно оси X. Это потребует изменений в различных способах проведения координатных осей и их оцифровки. Оставляем студентам составление такой программы в качестве упражнения на построение графиков функций.

 
< Пред   СОДЕРЖАНИЕ     След >