}

Во второй программе воспользуемся тем же самым набором данных и построим гистограмму, изображенную на рис. 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.

Выход процедуры р1еСЬа!^

Рис. 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); // Чистое окно изображения.


⇐ вернуться назад | | далее ⇒