Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (прогр) 2008июль.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
900.61 Кб
Скачать

8. Графика

Графический режим ПК зависят от типа монитора и видиоадаптера. Мы будем использовать лучший доступный в Паскале режим: VGA, максимальное разрешение 640х480 точек (пикселей), 16 цветов. Соответствующий драйвер находится в файле EgaVga.bgi. Графический режим определяет команда

InitGraph(драйвер, мода, путь к файлу драйвера)

где: драйвер – номер драйвера (для VGA – 9), мода – номер режима (для 640х480 – 2), путь к файлу драйвера на диске.

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

Возврат в текстовый режим экрана осуществляется оператором:

CloseGraph.

Паскаль располагает функциями, позволяющими осуществлять элементарные графические построения:

GetMaxY

Вертикальный размер экрана по оси Y (в режиме VGA =479, поскольку отсчет точек от 0).

GetMaxX

Горизонтальный размер экрана по оси X (в режиме VGA =639, поскольку отсчет от 0).

MoveTo(x,y)

Переместит курсор в позицию x,y.

MoveRel(dx,dy)

Переместит курсор от текущей точки на расстояние dx,dy

ClearDevice

Очищает экран.

PutPixel(x,y,цвет)

Выводит заданным цветом точку в координатах x,y.

Line(x1,y1,x2,y2)

Проводит прямую от точки с координатами x1,y1 до x2,y2.

LineTo(x,y)

Проводит прямую от текущей точки до точки с координатами x,y.

LineRel(dx,dy)

Проводит прямую от текущей точки на расстояние dx,dy.

Rectagle(x1,y1,x2,y2)

Контур прямоугольника с координатами левого верхнего (x1,y1) и правого нижнего (x2,y2) углов.

Bar(x1,y1,x2,y2)

Закрашивает прямоугольную область с координатами левого верхнего (x1,y1)

и правого нижнего (x2,y2) углов, установленным командой SetFillStyle, цветом.

Cyrcle(x,y,r)

Строит круг с центром в точке x,y и радиусом r.

Ellipse(x,y,угол1,

угол2,Rx,Ry)

Строит эллиптическую дугу с центром в точке x,y от начального угла1 (в градусах)

до угла2. Rx и Ry задают горизонтальный и вертикальный радиусы эллипса.

PieSlice(x,y,

угол1, угол2,r)

Строит сектор круга с центров в точке х,у радиусом r от угла1 (в целых градусах) до угла2.

Заполнение и закрашивание секторов осуществляется функцией SetFillStyle.

SetFillStyle(

заполнение,цвет)

Тип (0 нет, 1 сплошное, 2 горизонтальное, 3 штриховка /, 4 толстая штриховка /, 5 толстая штриховка \, 6 штриховка \, 7 +, 8 x, 9 клетка, 10 точки, 11 частые точки) и цвет заполнения фигур.

SetColor(цвет)

Устанавливает текущий цвет линий и символов: Black – 0, Blue – 1, Green – 2, Cyan – 3, Red – 4,

Magenta – 5, Brown – 6, LightGray – 7, DarkGray – 8, LightBlue – 9, LightGreen – 10, LightCyan – 11, LightRed – 12, LightMagenta – 13, Yellow – 14, White – 15.

SetBkColor(цвет)

Устанавливает текущий цвет фона.

SetLineStile(тип,

вид, толщина)

Устанавливает стиль линий. Тип: 0 – сплошная линия, 1– точечная,

2 – штрих-пунктир, 3 – пунктир. Вид: 0. Толщина: 1 или 3 пикселя.

Пример 8-1. Нарисовать на экране: 1). Две диагонали, пересекающиеся в центре. 2) Четыре концентрических окружности с центрами в центре экрана и радиусами 50, 100, 150, 200. Отсчет экранных координат начинается с левого верхнего угла: X – вправо, Y – вниз.

program P8_1

uses graph;

var d,i,m,rx,ry:integer;

begin

initgraph(d,m,''); {переход в графику}

ry:=getmaxy; rx:=getmaxx; {размер экрана}

line(0,0,rx,ry); {первая диагональ}

line(0,ry,rx,0); {вторая диагональ}

for i:=1 to 4 do begin{окружности}

circle(rx div 2,ry div 2,50*i);

end;

readln; {пауза для просмотра результата}

closegraph; {закрытие графического режима}

e

program P8_2;

uses graph;

var d,m,rx,ry:integer;

x,y,xn,xk,ymin,ymax,dx:real; msy,msx:real;

function f(x:real):real; {вычисление функции}

begin f:=sin(x)*x end;

begin

initgraph(d,m,''); {переход в графический режим}

ry:=getmaxy+1; rx:=getmaxx+1; {размер экрана}

line(0,0,0,ry); {ось Y}

xn:=0; xk:=60; dx:=0.01;{параметры аргумента}

x:=xn; {начальное Х}

ymin:=f(x); ymax:=f(x);

while x<=xk do begin {поиск максимума и минимума Y}

y:=f(x);

if y>ymax then ymax:=y;

if y<ymin then ymin:=y;

x:=x+dx; {изменяем Х}

end;

msy:=ry/abs(ymax-ymin); {масштаб по Y}

msx:=rx/abs(xk-xn); {масштаб по X}

x:=xn; {начальное Х}

while x<=xk do begin {рисование}

y:=f(x);

putpixel(round((x-xn)*msx),-round((y-ymax)*msy),2); {точки}

lineto(round((x-xn)*msx),-round((y-ymax)*msy)); {отрезки}

x:=x+dx; {изменяем Х}

end;

line(0,-round(-ymax*msy),rx,-round(-ymax*msy)); {ось X}

readln; {пауза для просмотра картинки}

closegraph;

end.

nd
.

Пример 8-2. Вывести на экран функцию f(x)=sin(x)x вместе с координатными осями. Аргумент X изменяется от начального значения Xn=0 до конечного Xk=20 с шагом dx=0.01. Главная проблема заключается в масштабировании исходной “натуральной” функции F в ее экранный вид Fэ: F(X)Fэ(Xэ). Здесь следует учесть, что экранные координаты расположены (рис. 8.1) не так как мы привыкли. Точка 0э,0э находится в его верхнем левом углу (а не в центре), ось Yэ идет вниз (а не вверх), ось Xэ – идет вправо. Т.о. для адекватного отображения графика на экране нам понадобится реализовать три действия:

1. Масштабировать диапазоны D изменения натуральных X и Y к желаемым экранным, т.е. привести DX, DY к DXэ и DYэ соответственно с помощью масштабных коэффициентов Mx=DXэ/Dx, My=DYэ/DY.

2. Перенести координаты так, чтобы максимум Yэ приходился на верхнюю границу экранной области, а начальное значение X – на левую ее границу.

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

Программа имеет следующую структуру. 1). Описывается функция вычисления f(x). 2). Выясняются размеры экрана, параметры аргумента, проводится вертикальная координата. 3). Находятся максимальные значения Y. 4). Выполняется масштабирование переменных (msy и msx). Эти значения указывают, сколько пикселей приходится на единицу изменения Y и X соответственно. 5). Выполняется собственно рисование кривой. Здесь оно выполнено двумя способами – точками и отрезками линий. Проверьте результат в обоих случаях, поочередно убрав одну из них. 6). Проводится ось X. Результат должен быть похож на рис. 8.2.

Задания для самостоятельного решения (рис. 8.3).

8.1. Решить аналогичную задачу, но ось Y направить горизонтально, а X – вертикально (рис. 8.3-1).

8.2. Известна зарплата (массив z[1..5]) работников (N=5) бригады. Построить диаграмму из вертикальных линий.

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

8.4. Известна зарплата (массив z[1..5]) и премия (массив p[1..5]) каждого из N=5 работников бригады. Построить совмещенную столбиковую диаграмму (на столбике зарплаты стоит столбик премии). Премия должна быть заштрихована командой SetFillStyle.

8.5. Для той же задачи построить секторную диаграмму зарплат. Указание. Сначала следует найти сумму всех зарплат s. Затем перевести зарплату каждого работника в градусы его сектора на диаграмме z[i]/s*360 и запомнить ее в массиве z[1..5]. Далее вычислить начальный и конечный угол каждого радиуса каждого сектора, нарисовать диаграмму командой PieSlice и раскрасить ее.