>

/* Строится единичная матрица 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++)


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