♦include <GL/glut.h>
♦include <math.h>
♦include <stdlib.h>
const double TWO_PI = 6.2831853;
/* Исходные размеры окна изображения. */
GLsizei winWidth = 400, winHeight = 400; GLuint regHex; class screenPt { private:
GLint x, y; public:
/* По умолчанию точке присваиваются координаты (0, 0).*/ screenPt ( ) {
х = у = 0;
}
void setCoords (GLint xCoord, GLint yCoord) { x = xCoord; у = yCoord;
}
GLint getx ( ) const { return x;
}
GLint gety ( ) const { return y;
}
} ;
static void init (void) {
screenPt hexVertex, circCtr;
GLdouble theta;
GLint k;
/* Задаются координаты центра окружности. */ circCtr.setCoords (winWidth / 2, winHeight / 2); glClearColor (1.0, 1.0, 1.0, 0.0);
// Цвет окна изображения выбирается белым.
/* Задается таблица отображений для красного правильного
* шестиугольника. Вершинами шестиугольника являются шесть
* равноудаленных друг от друга точек, лежащих на окружности. */
regHex = glGenLists (1);
// Таблице отображения присваивается идентификатор. glNewList (regHex, GL_COMPILE);
glColor3f (1.0, 0.0, 0.0);
// Цветом заполнения шестиугольника назначается красный.
glBegin (GL_POLYGON);
for (k = 0; k < 6; k++) { theta - TWO_PI * k / 6.0;
hexVertex.setCoords (circCtr.getx ( ) +
150 * cos (theta), circCtr.gety ( ) +
150 * sin (theta)); glVertex2i (hexVertex.getx(), hexVertex.gety ( ));
}
glEnd ( ); glEndList ( );
}
void regHexagon (void) {
glclear (GL_COLOR_BUFFER_BIT);
glCallList (regHex);
glFlush ( );
}
void winReshapeFcn (int newWidth, int newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( );
gluOrtho2D (0.0, (GLdouble) newWidth, 0.0, (GLdouble)
newHeight);
glClear (GL_COLOR_BUFFER_BIT);
}
void main (int argc, char** argv) { glutlnit (Sargc, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример функции изменения формы и таблицы отображений");
init ( );
glutDisplayFunc (regHexagon); glutReshapeFunc (winReshapeFcn);
glutMainLoop ( );
}
РЕЗЮМЕ
Графические примитивы, которые рассматриваются в этой главе, представляют собой основные средства формирования рисунков из отдельных точек, прямых линий, кривых, закрашенных многоугольников, матричных структур и текста. Примитивы описываются путем задания их геометрических описаний в декартовой внешней системе координат. Примеры изображений, полученных с помощью графических примитивов, показаны на рис. 3.65 и 3.66.
Три способа, с помощью которых можно расположить пиксели вдоль прямой линии, - алгоритм ЦДА, алгоритм Брезенхема и метод средней точки для прямой, - эквивалентны и являются наиболее эффективными. Коды цвета пикселей, расположенных вдоль прямой линии, рационально записываются в буфер кадра путем последовательного определения адресов в памяти. Любой из алгоритмов построения прямой линии можно адаптировать для параллельного выполнения, разделив линию на участки и распределив эти участки между доступными процессорами.
Преобразование стандартов развертки для окружностей и эллипсов можно эффективно и точно выполнять с помощью методов средней точки, учитывая при этом симметрию кривой. Другие конические сечения (параболы и гиперболы) можно строить с помощью аналогичных методов. Сплайновые кривые, которые являются кусочно-непрерывными полиномами, широко распространены в анимации и автоматизированном проектировании. Параллельное выполнение алгоритмов построения кривых можно реализовать аналогично тому, как реализуется параллельная обработка прямых линий.