Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение математических задач.pdf
Скачиваний:
39
Добавлен:
13.02.2015
Размер:
858.1 Кб
Скачать

графические операторы 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