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

4.5. Создание трехмерной диаграммы

Изображения, создаваемые в графическом режиме Турбо Паскаля, могут быть не только плоскими, но и трехмерными. В языке Паскаль существуют стандартные процедуры, позволяющие создавать достаточно качественные трехмерные изображения. К таким процедурам относится, в частности Bar3D, которая имеет следующий общий вид:

Bar3D(x1,y1,x2,y2,глубина, граница);

где Bar3D – служебное слово; x1 и y1 – координаты левого верхнего угла передней грани параллелепипеда; x2 и y2 – координаты правого нижнего угла передней грани параллелепипеда. Глубина – расстояние между передней и задней гранями. Граница – параметр логического типа,

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

целому типу.

Цвет и стиль закраски передней грани параллелепипеда определяется процедурой Setfillstyle. Цвет ребер параллелепипеда определяется процедурой setcolor. Закрашивать боковую и верхнюю грани

параллелепипеда необходимо самостоятельно, для чего можно использовать процедуру Floodfill.

Приведем пример использования процедуры Bar3D. Пусть на экране

компьютера необходимо изобразить параллелепипед с ребрами красного цвета, все грани которого должны быть окрашены в синий цвет. Передняя грань параллелепипеда должна иметь размеры 150 *100 пикселей, а глубина (то есть длина боковых граней) должна составлять 50 пикселей. Для выполнения поставленной задачи используется следующая последовательность операторов:

Setfillstyle(solidfill,blue);

Setcolor(red);

Bar3D(150,100,300,200,50,true);

floodfill(320,150,red);

floodfill(200,80,red);

Обратим внимание на следующий момент при написании данного фрагмента программы. По умолчанию процедура Bar3D закрашивает только

переднюю грань создаваемого с ее помощью параллелепипеда. Поэтому для

того, чтобы закрасить верхнюю и боковую грани параллелепипеда, мы дважды используем процедуру floodfill, в которой в качестве цвета

контура, ограничивающего размеры закрашиваемой области, указываем цвет

ребер параллелепипеда. Сама же заливка будет производиться тем цветом, который указан в процедуре Setfillstyle, то есть синим.

105

Возможности процедуры Bar3D можно использовать и для построения

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

Ниже приводится текст программы, решающей поставленную задачу.

program diag_3d; Uses Crt,Graph;

const x=50; y=450;

var x1,y1,grdr,grmd,dv,tr,hor,otl:integer; procedure stolb(c,k:integer; s:string; var

x1,y1:integer);

{данная процедура для каждой категории студентов строит столбец в диаграмме и добавляет

соответствующую запись в легенду} begin

setcolor(white);

setfillstyle(solidfill,c); bar3d(x1+30,y-k*20,x1+50,y-1,20,true); floodfill(x1+55,y-20,white); floodfill(x1+40,y-k*20-5,white); x1:=x1+50; bar3d(400,y1,440,y1+15,10,true); floodfill(442,y1+5,white); floodfill(420,y1-5,white); setcolor(lightgray); outtextXY(460,y1+5,s);

y1:=y1+30;

end; begin

ClrScr;

writeln('Программа построения объемной гистограммы');

writeln(' успеваемости группы студентов'); writeln('по итогам экзаменационной сессии'); writeln;

writeln('Введите количество двоечников'); readln(dv);

writeln;

writeln('Введите количество троечников'); readln(tr);

writeln;

writeln('Введите количество хорошистов'); readln(hor);

106

writeln;

writeln('Введите количество отличников'); readln(otl);

writeln;

Enter'); writeln('Для построения диаграммы нажмите

readln;

grdr:=detect;

initgraph(grdr,grmd,'d:\tp7\bgi'); x1:=x; y1:=200; setcolor(lightgray); line(x,y,x+225,y); line(x,125,x,y); line(x,y,x+150,y-150); OuttextXY(25,85,'количество'); OuttextXY(25,100,'студентов'); OuttextXY(x-20,y,'0'); line(x-3,y-100,x+3,y-100); OuttextXY(x-20,y-100,'5'); line(x-3,y-200,x+3,y-200); OuttextXY(x-20,y-200,'10'); line(x-3,y-300,x+3,y-300); OuttextXY(x-20,y-300,'15'); setcolor(white); stolb(brown,dv,'двоечники',x1,y1);

stolb(magenta,tr,'троечники',x1,y1);

stolb(green,hor,'хорошисты',x1,y1);

stolb(lightred,otl,'отличники',x1,y1);

Settextstyle(defaultfont,horizdir,2);

Setcolor(cyan);

группы');

OuttextXY(100,10,'Диаграмма успеваемости

OuttextXY(100,30,'по итогам сессии'); readln;

closegraph end.

Приведенная выше программа аналогична программе gistogr, хотя в

ней имеются и некоторые отличия. Так в основной части программы создается еще одна дополнительная координатная ось. Для построения столбца и добавления прямоугольника и записи в легенду также используется процедура stolb. Однако эта процедура была

модифицирована с учетом того, что в данном случае столбцы диаграммы являются не прямоугольниками, а параллелепипедами.

107

На рисунке 4.5 показано как может выглядеть диаграмма, построенная с помощью данной программы.

Рис.4.5. Результаты работы программы, строящей трехмерную гистограмму успеваемости группы студентов по итогам сессии

108