- •Учебное пособие
- •Введение
- •Глава 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. Создание трехмерной диаграммы
- •Библиографический список
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