}
Во второй программе воспользуемся тем же самым набором данных и построим гистограмму, изображенную на рис. 3.68. С помощью этой программы мы проиллюстрируем применение закрашенных прямоугольников, а также подписей, состоящих из растровых символов.
Рис. 3.68. Гистограмма, полученная с помощью процедуры ЬагСЬагЬ
void barChart (void) {
GLint month, к;
glClear(GL_COLOR_BUFFER_BIT); // Чистое окно изображения. glColor3f (1.0, 0.0, 0.0);
/* Задается красный цвет прямоугольников. */
for (к = 0; к < 12; к++)
glRecti (20 + к*50, 165, 40 + к*50, dataValue [к]); glColor3f (0.0, 0.0, 0.0);
/♦Задание черного цвета текста. */ xRaster = 20;
/* Изображение подписей на гистограмме. */ for (month = 0; month < 12; month++) { glRasterPos2i (xRaster, yRaster); for (k = 3*month; k < 3*month + 3; k++)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12,
label [h]);
xRaster += 50;
}
glFlush ( );
}
Чтобы показать процентное соотношение отдельных частей целого, часто используют секторные диаграммы. Следующая программа выдает секторную диаграмму, которая строится с помощью метода средней точки для построения окружности. Для количества и относительной величины секторов используются значения из предыдущего примера, а выход этой программы показан на рис. 3.69.
Рис. 3.69. Выход процедуры р1еСЬа!^
♦include <GL/glut.h>
♦include <stdlib.h>
♦include <math.h>
const GLdouble twoPi = 6.283185;
class scrPt { public:
GLint x, y; };
GLsizei winWidth = 400, winHeight = 300;
/* Исходный размер окна изображения. *. void init (void){
glClearColor (1.0, 1.0, 1.0, 1.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
// Процедуры // изображения // окружности.
void pieChart (void){
scrPt circCtr, piePt;
GLint radius = winWidth /4; // Радиус окружности.
GLdouble sliceAngle, previousSliceAngle = 0.0;
GLint k, nSlices =12; // Количество секторов.
GLfloat dataValues[12] =10.0, 7.0, 13.0, 5.0, 13.0, 14.0,
3.0, 16.0, 5.0, 3.0, 17.0, 8.0;
GLfloat dataSum = 0.0;
circCtr.x = winWidth / 2; // Координаты
circCtr.у = winHeight /2; // центра окружности.
circleMidpoint (circCtr, radius); // Вызов процедуры
// построения окружности методом средней точки, for (к = 0; к < nSlices; к++) dataSum += dataValues[к]; for (к = 0; к < nSlices; к++) {
sliceAngle = twoPi * dataValues[к] / dataSum + previousSliceAngle; piePt.x = circCtr.x + radius * cos (sliceAngle);
piePt.у = circCtr.у + radius * sin (sliceAngle);
glBegin (GL_LINES);
glVertex2i (circCtr.x, circCtr.y); glVertex2i (piePt.x, piePt.y); glEnd ( );
previousSliceAngle = sliceAngle;
}
}
void displayFcn (void){
glClear (GL_COLOR_BUFFER_BIT); // Чистое окно изображения.