ПРИМЕРЫ ПРОГРАММ
Здесь приводится несколько примеров программ OpenGL, которые служат иллюстрацией применения результирующих примитивов. В каждой программе используется одна или несколько функций из тех, которые перечислены в табл. 3.1. Окно изображения для выхода в каждой программе задается с помощью стандартных процедур GLUT, описанных в главе 2.
Первая программа служит иллюстрацией использования ломаной линии, набора полимаркеров и подписей, состоящих из растровых символов, для построения линейного графика по данным для каждого месяца в течение одного года. Здесь показан пропорциональный шрифт, хотя по точкам на графике легче выравнивается шрифт с постоянной шириной символов. Поскольку растровые положения определяются по левому нижнему углу с помощью функции определения растрового положения, необходимо сместить точку отсчета, чтобы выровнять центр текстовой строки по положению точек на графике. На рис. 3.67 показан выход программы построения линейного графика.
finclude <GL/glut.h>
GLsizei winWidth = 600, winHeight = 500;
/* Исходный размер окна изображения. */
GLint xRaster = 25, yRaster = 150;
/* Инициализация растрового положения. */
GLubyte label [36] = 'J','a','n', 'F','e','b', 'M','a', 'r',
'A','p','r', 'M','a','y', 'J','u', 'n', 'J'/u','l', 'A'/u','g', ' S',' e', 'p', '0,,,c','t', 'N','o','v', 'D',' e', 'c'; GLint dataValue [12] = 420, 342, 324, 310, 262, 185,
190, 196, 217, 240, 312, 438;
void init (void) {
glClearColor (1.0, 1.0, 1.0, 1.0); // Белое окно.
glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 600.0, 0.0, 500.0);
}
void lineGraph (void) {
GLint month, k;
GLint x = 30; // Инициализация координаты x.
glClear (GL_COLOR_BUFFER_BIT); // Чистое окно изображения. glColor3f (0.0, 0.0, 1.0); // Задание синего цвета линии. glBegin (GL_LINE_STRIP) ;
/* Изображение графика в виде ломаной линии. */ for (к = 0; к < 12; к++)
glVertex2i (х + к*50, dataValue [к]); glEnd ( );
glColor3f (1.0, 0.0, 0.0);
/* Задание красного цвета маркера. */ for (к = 0; к < 12; к++) {
/* Изображение данных полимаркером (звездочками). */ glRasterPos2i (xRaster + k*50, dataValue [k] - 4); glutBitmapCharacter (GLUT_BITMAP_9_BY_15, '*'); } 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 [k]);
xRaster += 50; } glFlush ( );
}
void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( );
gluOrtho2D (0.0, GLdouble (newWidth),
0.0, GLdouble (newHeight));
glClear (GL_COLOR_BUFFER_BIT);
}
void main (int arge, char** argv) { glutlnit (Sarge, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Линейный график данных");
init ( ) ;
glutDisplayFunc (lineGraph); glutReshapeFunc (winReshapeFcn); glutMainLoop ( );