float sum:
Affine4 tmp:
tmp.set(*this): // tmp copy // копия tmp
for(int с - 0: с < 4; С++)
Приложение В. Некоторые полезные классы и служебные подпрограммы
// form this - tmp * п
// формируем this - tmp * n
for(int г - 0; г <4 : г++)
{
sum - 0:
for(int k - 0: k < 4: k++)
sum +- tmp.m[4 * k + r]* n.m[4 * с + k]: m[4 * с + г] - sum;
}
// end of for loops // конец циклов for
}
// AffineStack methods // методы AffineStack void AffineStack ;: dup() {
AffineNode* tmp - new AffineNode: tmp->affn - new Affine4(*(tos->affn)); tmp->invAffn - new Affine4(*(tos->invAffn)); tmp-[greater]next - tos: tos - tmp:
}
void AffineStack :: setldentityO
// make top item the identity matrix
// делаем верхний элемент единичной матрицей
{
assertUos !- NULL):
tos->affn->setIdentityMatrix():
tos->invAffn->setIdentityMatrix():
}
void AffineStack :: popAndDropO {
if(tos - NULL) return: // do nothing // не делаем ничего
AffineNode *tmp - tos:
tos - tos-[greater]next:
delete tmp;
// should call destructor, which deletes matrices // нужно вызвать деструктор, удаляющий матрицы }
void AffineStack :: releaseAffinesO {
// pop and drop all remaining Items // выталкиваем и отбрасываем все оставшиеся элементы while(tos) popAndDrop():
}
void AffineStack :: rotate(float angle. Vector3 u) {
Affine4 rm: // make identity matrix // создаем единичную матрицу
Affine4 invRm:
u.normalizeO: // make the rotation axis unit length // создаем ось поворота единичной длины
float ang - angle * 3.14159265/ 180: // deg to
// градусы в радианы
float с - cos(ang). s - sin(ang);
float mc - 1.0 - c: // fill the 3x3 upper left matrix -// заполняем 3x3 верхних левых элемента матрицы
rm.m[0] - с + mc * u.x * u.x:
rm.m[l] - mc * u.x * u.y + s * u.z:
rm.m[2] - mc * u.x * u.z - s * u.y;
rm.m[4] - mc * u.y * u.x - s * u.z:
rm.m[5] - с + mc * u.y * u.y;
rm.m[6] - mc * u.y * u.z + s * u.x:
rm.m[8] - mc * u.z * u.x + s * u.y;
rm.m[9] - mc * u.z * u.y - s * u.x;
rm.m[10] - с + mc * u.z * u.z: // same for inverse: just sign of s is changed // то же для обратной: только знак s меняется