glVertex2f (verts [k].x, verts [k].y); glEnd ( );
void displayFcn (void)
{
/* Определяются исходные положения вершин треугольника. */ GLint nVerts = 3;
wcPt2D verts [3] = 50.0, 25.0, 150.0, 25.0, 100.0, 100.0 ;
/* Вычисляется положение центра масс треугольника. */ wcPt2D centroidPt;
GLint k, xSum = 0, ySum = 0; for (k = 0; k < nVerts; k++) { xSum += verts [k].x; ySum += verts [k].y;
}
centroidPt.x = GLfloat (xSum) / GLfloat (nVerts);
centroidPt.y = GLfloat (ySum) / GLfloat (nVerts);
/* Задаются параметры геометрического преобразования. */ wcPt2D pivPt, fixedPt; pivPt = centroidPt; fixedPt = centroidPt;
GLfloat tx = 0.0, ty = 100.0;
GLfloat sx = 0.5, sy = 0.5;
GLdouble theta = pi/2.0;
glClear (GL_COLOR_BUFFER_BIT); // Очищается окно на экране.
glColor3f (0.0, 0.0, 1.0);
/* Исходный цвет заполнения выбирается синим. */ triangle (verts); // Отображается синий треугольник.
/* Сложная матрица инициализируется как единичная. */ matrix3x3SetIdentity (matComposite);
/* Строится сложная матрица для последовательности преобразований. */ scale2D (sx, sy, fixedPt);
/* Первое преобразование: масштабирование. */ rotate2D (pivPt, theta);
/* Второе преобразование: поворот. */ translate2D (tx, ty);
/* Последнее преобразование: трансляция. */
/* Сложная матрица действует на вершины треугольника. */ transformVerts2D (nVerts, verts);
glColor3f (1.0, 0.0, 0.0);
/* Задается цвет преобразованного треугольника. */ triangle (verts);
/* Отображается красный преобразованный треугольник. */ glFlush ( );
)
void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( );
glu0rtho2D (xwcMin, xwcMax, ywcMin, ywcMax); glClear (GL_COLOR_BUFFER_BIT);
}
void main (int arge, char ** argv)
{
glutlnit (&argc, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Последовательность геометрических преобразований");
init ( ) ;
glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn);
glutMainLoop ( ) ;
}
ДРУГИЕ ДВУХМЕРНЫЕ ПРЕОБРАЗОВАНИЯ
Такие базовые преобразования, как трансляция, поворот и масштабирование, являются стандартными компонентами графических библиотек. Некоторые пакеты предлагают несколько дополнительных преобразований, полезных в определенных приложениях. Двумя такими преобразованиями являются отражение и сдвиг.
ОТРАЖЕНИЕ
Преобразование, дающее зеркальное изображение объекта, называется отражением. При двухмерном отражении это изображение генерируется относительно оси отражения как поворот объекта на 180° относительно оси отражения. Ось отражения можно выбрать на плоскости ху или перпендикулярно плоскости ху. Когда ось отражения является линией на плоскости ху, траектория поворота вокруг этой оси находится в плоскости, перпендикулярной плоскости ху. Когда ось отражения перпендикулярна плоскости ху, траектория поворота лежит в плоскости ху. Ниже приводятся примеры некоторых распространенных отражений.