♦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.

Три способа, с помощью которых можно расположить пиксели вдоль прямой линии, - алгоритм ЦДА, алгоритм Брезенхема и метод средней точки для прямой, - эквивалентны и являются наиболее эффективными. Коды цвета пикселей, расположенных вдоль прямой линии, рационально записываются в буфер кадра путем последовательного определения адресов в памяти. Любой из алгоритмов построения прямой линии можно адаптировать для параллельного выполнения, разделив линию на участки и распределив эти участки между доступными процессорами.

Преобразование стандартов развертки для окружностей и эллипсов можно эффективно и точно выполнять с помощью методов средней точки, учитывая при этом симметрию кривой. Другие конические сечения (параболы и гиперболы) можно строить с помощью аналогичных методов. Сплайновые кривые, которые являются кусочно-непрерывными полиномами, широко распространены в анимации и автоматизированном проектировании. Параллельное выполнение алгоритмов построения кривых можно реализовать аналогично тому, как реализуется параллельная обработка прямых линий.


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