>
/* Строится единичная матрица 3 на 3. */ void matrix3x3SetIdentity (Matrix3x3 matldent3x3) { GLint row, col; for (row = 0; row < 3; row++) for (col = 0; col < 3; col++)
matldent3x3 [row] [col] = (row == col);
}
/* Матрица ml слева множится на m2, результат записывается в m2. */ void matrix3x3PreMultiply (Matrix3x3 ml, Matrix3x3 m2)
{
GLint row, col;
Matrix3x3 matTemp;
for (row = 0; row < 3; row++)
for (col = 0; col < 3 ; col++)
matTemp [row][col] = ml [row][0] * m2 [0][col] + ml [row][1] * m2 [1][col] + ml [row][2] * m2 [2][col]; for (row = 0; row < 3; row++) for (col = 0; col < 3; col++)
m2 [row][col] = matTemp [row][col];
}
void translate2D (GLfloat tx, GLfloat ty)
{
Matrix3x3 matTransl;
/* Матрица трансляции инициализируется как единичная. */ matrix3x3SetIdentity (matTransl); matTransl [0][2] = tx; matTransl [1] [2] = ty;
/* Выполняется свертка матрицы matTransl со сложной матрицей. */ matrix3x3PreMultiply (matTransl, matComposite);
}
void rotate2D (wcPt2D pivotPt, GLfloat theta) {
Matrix3x3 matRot;
/* Матрица поворота инициализируется как единичная. */ matrix3x3SetIdentity (matRot); matRot [0][0] = cos (theta); matRot [0][1] = -sin (theta);
matRot [ 0][2] = pivotPt.x * (1 - cos (theta)) +
pivotPt.у * sin (theta); matRot [ 1] [0] = sin (theta);
matRot [1][1] = cos (theta);
matRot [1] [2] = pivotPt.у * (1 - cos (theta)) pivotPt.x * sin (theta);
/* Проводится свертка матрицы matRot со сложной матрицей. */ matrix3x3PreMultiply (matRot, matComposite);
}
void scale2D (GLfloat sx, GLfloat sy, wcPt2D fixedPt)
{
Matrix3x3 matScale;
/* Матрица масштабирования инициализируется как единичная. */ matrix3x3SetIdentity (matScale); matScale [0][0] = sx;
matScale [0][2] = (1 - sx) * fixedPt.x;
matScale [1][1] = sy;
matScale [1][2] = (1 - sy) * fixedPt.y;
/* Проводится свертка матрицы matScale со сложной матрицей. */ matrix3x3PreMultiply (matScale, matComposite);
)
/* С помощью сложной матрицы вычисляются преобразованные координаты. */ void transformVerts2D (GLint nVerts, wcPt2D * verts)
{
GLint k;
GLfloat temp;
for (k = 0; k < nVerts; k++) {
temp = matComposite [0][0] * verts [k].x + matComposite [0][1] * verts [k].y + matComposite [0][2]; verts [k].y = matComposite [1] [0] * verts [k].x + matComposite [1][1] * verts [k].y + matComposite [1][2]; verts [k].x = temp;
}
}
void triangle (wcPt2D *verts)
{
GLint k;
glBegin (GLJTRIANGLES); for (k = 0; k < 3; k++)