- •Учебное пособие
- •Введение
- •Глава 1. Прикладные математические задачи
- •1.1. Вычисление математических функций
- •1.2. Создание программного модуля, объединяющего математические функции
- •1.3. Решение системы линейных алгебраических уравнений
- •1.4. Построение таблицы функции
- •Глава 2. Задачи вычислительной математики
- •2.1. Решение нелинейного уравнения
- •2.2. Численное дифференцирование
- •2.3. Численное интегрирование
- •2.4. Решение дифференциального уравнения
- •2.5. Аппроксимация функции
- •2.6. Интерполяция функции
- •Глава 3. Задачи математической статистики
- •3.1. Вычисление основных статистических величин
- •3.2. Создание программного статистического модуля
- •4. Построение графиков функций и создание диаграмм
- •4.1. Инициализация графического режима
- •4.2. Использование графических примитивов
- •4.3. Создание двумерной диаграммы
- •4.4. Построение графика функции
- •4.5. Создание трехмерной диаграммы
- •Библиографический список
графические операторы readln;
CloseGraph end.
Пустой оператор readln используется в данном шаблоне в тех же
целях, что и в текстовом режиме – для того, чтобы результаты работы программы не исчезали с экрана. Каждый пользователь может создать такой же шаблон и для своего компьютера. Меняться в нем будет только имя вновь создаваемой программы и содержимое той части программы, в которой непосредственно используются графические операторы.
4.2. Использование графических примитивов
После того как графический режим на компьютере установлен, можно непосредственно приступать к созданию различных графических объектов. Процесс создания даже достаточно сложных изображений можно в принципе свести к нескольким простым операциям. Это, во-первых, позиционирование курсора, то есть установка его в определенное место на экране компьютера, во-вторых – задание основного цвета изображения и цвета фона, и в-третьих
– рисование графических примитивов, то есть простых геометрических фигур, из которых впоследствии можно формировать более сложные изображения, в-четвертых – вывод текста в графическом режиме.
Позиционирование курсора осуществляется с помощью процедуры MoveTo. Общий вид процедуры:
MoveToXY(x,y);
где x и y – координаты той точки на экране компьютера, в которую будет перемещен курсор. Данная процедура сходна с процедурой GotoXY
текстового режима, но координаты той позиции, куда перемещается курсор, задаются не в знакоместах, а в пикселях. При этом нужно иметь в виду ряд особенностей отсчета координат в графическом режиме работы компьютера, причем эти особенности касаются и других графических процедур.
Во-первых, координаты измеряются в данном случае не в каких-либо фиксированных единицах длины (сантиметрах, миллиметрах или дюймах), а в пикселях. Размер пикселя – эта величина относительная, зависящая от размера экрана компьютера и установленного в данный момент разрешения. Начальная точка отсчета в графическом режиме имеет координаты 0,0, а координаты конечной точки зависят от установленного разрешения. Для разрешения 640*480 эти координаты составляют 639,479. Если пользователь не уверен в том, какое разрешение используется в данном режиме, то для его
определения можно воспользоваться стандартными процедурами GetMaxX и GetMaxY. Эти процедуры не имеют параметров. Результатами работы
79
данных процедур являются соответственно максимальные в данном видеорежиме горизонтальная и вертикальная координаты.
Во-вторых, начальная точка отсчета с координатами 0,0 расположена в левом верхнем углу экрана, а не посредине как в случае с обычными осями координат. Поэтому если горизонтальные координаты отсчитываются привычным образом, то с вертикальными координатами дело обстоит иначе. Чем больше значение вертикальной координаты, тем ниже расположена соответствующая точка. Поэтому максимальные значения вертикальной и горизонтальной координат (в большинстве случаев это 639,479) имеет точка, расположенная в правом нижнем углу экрана.
При необходимости переместить курсор относительно текущей его позиции используется процедура MoveRel. Общий вид процедуры:
MoveRel(x,y);
Данная процедура перемещает курсор относительно его текущего положения на x пикселей вправо и на y пикселей вниз. В случае
необходимости переместить курсор влево или вверх, следует задавать отрицательные значения соответственно для x и для y.
Далее пользователь может задать цвет фона, на котором будет выводиться создаваемое им изображение. Это можно сделать двумя
способами:
1. Задать цвет фона командой SetBkColor(цвет), а затем очистить экран компьютера командой ClearDevice. Тогда весь экран будет закрашен цветом, который задан командой SetBkColor. Если, например,
требуется закрасить весь экран зеленым цветом, то последовательность команд будет такая:
SetBkColor(Green);
ClearDevice;
Затем на получившемся фоне можно рисовать фигуры и линии различного цвета. Но данный способ не годится в том случае, если на цветном фоне требуется вывести какое-либо изображение или надпись черного цвета. Заданный Вами объект просто не будет виден на экране. Поэтому для того, чтобы можно было использовать всю имеющуюся в языке Паскаль палитру цветов, включая и черный, рекомендуется прибегнуть к другому способу.
2. Использование процедур закрашивания областей экрана. В этом случае операция закрашивания производится следующим образом: в начале
задается стиль заполнения области, которая может занимать как часть экрана компьютера, так и весь экран, с помощью процедуры SetFillStyle. Эта
процедура определяет как цвет закрашиваемой области, так и способ закрашивания. Общий вид данной процедуры:
SetFillStyle(способ, цвет);
80
где цвет – это один из стандартных цветов палитры Паскаля, а способ –
один из 12 возможных способов заполнения текущей области. Способ заполнения определяется с помощью одного из следующих служебных слов:
EmptyFill - заполнение цветом фона ;
SolidFill – сплошное заполнение цветом, указанным в процедуре;
LineFill - горизонтальная штриховка; LtSlashFill – косая штриховка;
SlashFill – косая штриховка толстыми линиями; BkSlashFill – обратная косая штриховка толстыми линиями; LtBkSlashFill – обратная косая штриховка;
HatchFill - заполнение прямой клеткой; XHatchFill - заполнение косой клеткой; InterleaveFill - заполнение частой сеткой; WideDotFill - заполнение редкими точками; CloseDotFill - заполнение частыми точками;
UserFill - тип задается пользователем.
Из всех возможных способов заполнения (заполнение
горизонтальными, диагональными линиями, заполнение в клетку, точками и т.д.) воспользуемся в данном случае способом Solidfill – сплошное заполнение области цветом, указанным в процедуре SetFillStyle.
На следующем этапе данной операции производится собственно «заливка» области командой Floodfill. Общий вид данной команды
следующий:
Floodfill(x,y,цвет),
где x и y – соответственно вертикальная и горизонтальная координаты любой точки, находящейся внутри закрашиваемой области, цвет – цвет
границы закрашиваемой области. Если точка, с которой начинается закрашивание, не находится внутри замкнутой области, то закрашен будет весь экран. В данном случае та же операция закрашивания всего экрана зеленым цветом будет выглядеть так:
Setfillstyle(solidfill,green); Floodfill(100,100, green);
Поскольку закрашиваться будет весь экран, то в принципе в процедуре Floodfill можно указать любую точку экрана от 0,0 до 639,479. Такой
способ закрашивания предпочтительнее в том случае, если пользователю необходимо будет использовать для создания графических объектов и черный цвет.
После того как задан основной цвет экрана, можно приступать к созданию на нем каких-либо изображений и надписей. Перед созданием графических объектов необходимо задать их цвет командой
81
Setcolor(цвет), которая по своему формату аналогична используемой в текстовом режиме команде Textcolor.
Цветом, указанным командой Setcolor, можно выводить различные
графические примитивы, к числу которых относится вывод рамки (контура
прямоугольника), который осуществляется посредством процедуры Rectangle. Общий вид данной процедуры:
Rectangle(x1,y1,x2,y2);
где x1 и y1 – соответственно горизонтальная и вертикальная координаты верхнего левого угла выводимой рамки, а x2 и y2 – координаты правого
нижнего угла рамки.
Операция создания рамки красного цвета, верхний левый угол которой будет иметь координаты 100,100, а нижний правый – 300,300, будет выглядеть так:
SetColor(Red);
Rectangle(100,100,300,300);
Вывод текста в графическом режиме может осуществляться двумя способами. Процедура Outtext позволяет выводить текст, начиная с
текущей позиции, то есть с той, в которой в данный момент находится курсор. Общий вид этой процедуры следующий:
Outtext(текст);
где текст – содержит выводимое процедурой сообщение. Текстовые константы в графическом режиме должны выводиться в апострофах, так же как и в текстовом режиме.
Более удобной для пользователя в большинстве случаев является другая процедура OuttextXY, которая позволяет выводить текст, начиная с
позиции, задаваемой самим пользователем. Общий вид данной процедуры следующий:
OuttextXY(x,y,текст);
где x и y – горизонтальная и вертикальная координаты той точки, начиная с
которой будет выводиться надпись. Данная процедура аналогична процедурам write и writeln текстового режима, но преимущество
процедуры OuttextXY заключается в том, что нет необходимости в
предварительном позиционировании курсора. Все выполняется одной командой. Если, например, нужно вывести на экран компьютера бирюзовым цветом надпись «Графический режим», начиная с точки с координатами 150,200, то это можно сделать следующей последовательностью операторов:
Setcolor(Cyan); OuttextXY(150,200,’Графический режим’);
82
Для того чтобы изменить характеристики выводимого текста, следует использовать процедуру SettextStyle. Эта процедура имеет три
различных параметра. Общий вид данной процедуры следующий:
Settextstyle(гарнитура_шрифта, направление_шрифта, размер_шрифта);
где гарнитура_шрифта – тип используемого в программе шрифта.
Система Турбо Паскаль располагает несколькими различными шрифтами, но
если нужно вывести текст на экран текст на русском языке, то можно использовать только шрифт defaultfont, поддерживающий символы кириллицы. Направление_шрифта определяет горизонтальную и
вертикальную ориентацию шрифта. Для горизонтальной ориентации шрифта второй параметр процедуры должен иметь значение horizdir. Наконец,
размер_шрифта определяет размер выводимого изображения. Если задать
его значение равным единице, то размер текста будет стандартным. Если же необходимо вывести текст большего размера, то данный параметр следует задать равным 2. В этом случае размер букв увеличится в два раза по вертикали и по горизонтали.
Следующая команда графического режима позволяет выводить на экран компьютера прямоугольники, закрашенные различными цветами. На
фоне таких прямоугольных окон можно затем выводить различные изображения и надписи, то есть эта команда сходна с процедурой Windows
текстового режима. Называется эта команда Bar и общий вид ее следующий:
Bar(x1,y1,x2,y2);
где x1 и y1 – вертикальная и горизонтальная координаты верхнего левого угла создаваемого прямоугольного окна, а x2 и y2 – координаты правого
нижнего угла данного окна. При использовании данной процедуры следует
иметь ввиду, что цвет создаваемого окна задается не процедурой Setcolor, как в случае вывода прямоугольной рамки или текста, а другой уже знакомой нам процедурой Setfillstyle. Поэтому, если в ходе
работы над программой возникает необходимость вывести на экран компьютера прямоугольное окно, верхний левый угол которого имеет координаты 200,200, а нижний правый угол – координаты 350,300, и закрасить его синим цветом, то необходимо использовать следующую последовательность операторов:
Setfillstyle(solidfill,Blue);
Bar(200,200,350,300);
Как уже говорилось, средствами графики языка Паскаль можно создавать и гораздо более сложные изображения, включающие различные графические объекты, состоящие из ломаных и кривых линий, а также закрашивать различными цветами области, ограниченные этими линиями. Перед тем как приступить к созданию следующей программы, мы
83
познакомимся еще с некоторыми процедурами, позволяющими создавать различные графические примитивы, а также изменять размер выводимого текста.
Прежде всего, для создания более сложных композиций следует научиться рисовать отрезки прямых линий. Для этого используется процедура Line. Общий вид процедуры:
Line(x1,y1,x2,y2);
где x1 и y1 – горизонтальная и вертикальная координаты начала данного
отрезка, а x2 и y2 – координаты конца отрезка. Цвет отрезка предварительно задается процедурой SetColor. Если пользователю нужно вывести на экран
компьютера отрезок желтого цвета, начало которого находится в точке с координатами 150,150, а конец — в точке с координатами 200,175, то для этого нужно написать в программе следующие операторы:
Setcolor(Yellow); Line(150, 150,200,175);
Можно рисовать отрезки и начиная с текущей позиции курсора. В этом случае используется команда LineTo. Общий вид данной команды:
LineTo(x,y);
где x и y – координаты конца создаваемого отрезка. Необходимости задавать
координаты начала отрезка в данном случае нет, так как они уже известны. Один из способов рисования кривых линий в программе заключается в
использовании процедуры Arc. Эта процедура позволяет нарисовать дугу определенного размера. Общий вид процедуры следующий:
Arc(x,y,c1,c2,r);
где x и y – координаты центра окружности, частью которой является данная дуга, r – радиус данной окружности. Параметры процедуры c1 и с2 задают
угловые координаты начальной и конечной точек дуги. Углы отсчитываются от горизонтальной оси экрана компьютера против часовой стрелки и
задаются в градусах. Цвет дуги задается уже знакомой нам процедурой
SetColor.
Таким образом, операция выведения на экран компьютера дуги фиолетового цвета, равной по величине половине окружности, имеющей центр в точке 200,200 и радиус 50, начинающейся в 90 градусах от горизонтальной оси, отсчитываемых против часовой стрелки, будет выглядеть следующим образом.
SetColor(Magenta);
Arc(200,200,90,270,50);
Таким способом удобно строить кривые, представляющие собой различные части окружности. Если же необходимо построить какую-либо кривую произвольной формы, то для этого необходимо прибегать к
84
построению кривой по точкам. Эту операцию мы подробно рассмотрим в следующем разделе, посвященном построению графиков.
Построить же целую окружность можно с помощью другой процедуры Circle, имеющей меньшее число параметров. Общий вид данной
процедуры следующий:
Circle(x,y,r);
где x и y – координаты центра окружности, а r – радиус этой окружности. Цвет окружности определяется процедурой SetColor. Построение
окружности светло-красного цвета с центром в точке 300,300 с радиусом 75 производится следующими операторами:
Setcolor(LightRed);
Circle(300,300,75);
В том случае, если необходимо закрасить внутренность окружности, прибегают к уже знакомой нам процедуре floodfill. В данном случае эта
процедура будет закрашивать не весь экран, а только ту его область, которая ограничена линией окружности. В качестве точки, с которой начинается закраска, можно указать, например, центр окружности. Стиль заполнения,
для отдельной области, как и для всего экрана в целом, задается процедурой Setfillstyle. Для того чтобы закрасить внутренность только что
созданной нами окружности, следует использовать следующую последовательность операторов.
Setfillstyle(solidfill,LightRed);
Floodfill(350,350,LightRed);
Аналогичной последовательностью процедур Setfillstyle и Floodfill можно закрашивать внутреннюю область любой другой
геометрической фигуры, а не только окружности. Однако, при
использовании данной процедуры следует обратить внимание на то, чтобы контур заполняемой процедурой Floodfill фигуры был обязательно
замкнутым. Кроме того, исходная точка, с которой начинается заливка, должна находиться только внутри этого замкнутого контура. В случае
невыполнения какого-либо из этих двух условий, краской указанного в последней процедуре Setfillstyle цвета будет закрашен весь экран.
Часто при выводе на экран компьютера графический объект лучше
выглядит, если контур его имеет один цвет, а «внутренность» - другой. В таком случае цвет «полости» задается в процедуре Setfillstyle, а цвет контура задается командой Setcolor, затем с помощью соответствующей процедуры рисуется сам контур, и далее процедурой Floodfill
производится заливка полости, а в качестве цвета контура, ограничивающего
область заливки, в этой процедуре указывается тот же цвет, что и в процедуре Setcolor. Например, если требуется вывести на экран
компьютера прямоугольник, контур которого синий, а внутренняя полость
85
закрашена зеленым цветом, это можно сделать при помощи следующей последовательности операторов:
Setfillstyle(solidfill,green);
Setcolor(blue);
Rectangle(150,350,450,450);
Floodfill(300,400,blue);
Еще одной полезной процедурой, используемой в языке Паскаль для
построения закрашенного сектора окружности, является процедура Pieslice. Общий вид данной процедуры следующий:
Pieslice(x,y,un,uk,r);
где x и y – соответственно горизонтальная и вертикальная координаты центра сектора, un и uk – угловые координаты начальной и конечной точек линии окружности данного сектора, r – радиус сектора. Окружность
вычерчивается от начальной к конечной точке против часовой стрелки. Если
задать значение un равным 0, а uk – равным 360, то данная процедура нарисует круг. Цвет границы сектора задается процедурой setcolor, а цвет его внутренней части — процедурой setfillstyle. Поэтому для того,
чтобы нарисовать на экране компьютера сектор с радиусом 50, равный по угловой величине четверти круга, граница которого будет светло-красного цвета, а внутренность – желтого, нужно выполнить следующую последовательность команд:
Setcolor(lightred);
Setfillstyle(solidfill,yellow);
Pieslice(200,200,0,90,50);
Использование вышеописанных процедур наглядно демонстрирует программа primitiv (см. рис. 4.1), которая на светло-сером фоне экрана
выводит изображение трех геометрических фигур: квадрата зеленого цвета, круга красного цвета и треугольника синего цвета. Вывод на экран компьютера даже такого простого геометрического рисунка в текстовом режиме Турбо Паскаля был бы невозможен.
Создание закрашенного квадрата осуществляется с помощью
процедуры Bar. При этом не забываем предварительно указать стиль заполнения процедурой Setfillstyle. Для изображения закрашенного
круга в начале рисуем окружность такого же цвета, а затем заливаем ее, как было выше описано. Несколько сложнее изобразить на экране треугольник. Для этого необходимо вначале нарисовать три линии, причем конец первой линии должен совпадать с началом второй, конец второй – с началом третьей, а конец третьей линии – с началом первой. Таким образом создается
замкнутый контур. При закрашивании получившегося контура с помощью процедуры Floodfill координаты исходной точки следует подобрать
таким образом, чтобы она находилась внутри данного контура. Под
86
получившимися изображениями фиолетовым цветом выводим поясняющую подпись.
Таким образом, получаем следующую программу:
program primitiv; Uses Graph;
var grad,grreg:integer; begin
grad:=detect;
Initgraph(grad,grreg,'d:\tp7\bgi');
Setfillstyle(solidfill,lightgray);
floodfill(100,100,lightgray);
Setfillstyle(solidfill,green);
bar(100,150,200,250);
setcolor(lightred);
circle(300,200,50);
Setfillstyle(solidfill,lightred);
floodfill(300,200,lightred);
setcolor(blue);
line(400,250,460,150);
line(460,150,520,250);
line(520,250,400,250);
Setfillstyle(solidfill,blue);
floodfill(460,200,blue);
setcolor(magenta);
outtextXY(100,300,'Изображение геометрических фигур в графическом режиме');
readln; Closegraph end.
Рис.4.1. Результат работы программы, создающий основные графические примитивы в графическом режиме Turbo Pascal
87
