Я пишу математические классы для использования с графикой opengl, которая использует упорядочение основных столбцов матрицы. Это домашнее задание.
Для mat3 (мой класс матрицы 3×3), наряду с другими матричными классами, я предложил использовать объединенную нотацию для описания данных матрицы. Теперь я беспокоюсь, что мой порядок неправильный (например, основной ряд, а не основной столбец).
#define real float
union
{
real _data[9];
struct
{
real _11; real _12; real _13;
real _21; real _22; real _23;
real _31; real _32; real _33;
};
struct
{
real _a; real _b; real _c;
real _d; real _e; real _f;
real _g; real _h; real _i;
};
};
Должен ли я вместо этого писать эту 2-ю структуру следующим образом:
struct
{
real _a; real _d; real _g;
real _b; real _e; real _h;
real _c; real _f; real _i;
};
далее, я должен написать первую структуру следующим образом:
struct
{
real _11; real _21; real _31;
real _12; real _22; real _32;
real _13; real _23; real _33;
};
Повлияет ли это на порядок умножения матриц или других математических операций (определитель, обратный, транспонировать …)? Например. В настоящее время моя функция умножения mat3 выглядит следующим образом:
mat3 operator * ( const mat3 & l, const mat3 & r )
{
// matrix matrix multiply
return mat3(
( (l._11 * r._11) + (l._12 * r._21) + (l._13 * r._31) ),
( (l._11 * r._12) + (l._12 * r._22) + (l._13 * r._32) ),
( (l._11 * r._13) + (l._12 * r._23) + (l._13 * r._33) ),
( (l._21 * r._11) + (l._22 * r._21) + (l._23 * r._31) ),
( (l._21 * r._12) + (l._22 * r._22) + (l._23 * r._32) ),
( (l._21 * r._13) + (l._22 * r._23) + (l._23 * r._33) ),
( (l._31 * r._11) + (l._32 * r._21) + (l._33 * r._31) ),
( (l._31 * r._12) + (l._32 * r._22) + (l._33 * r._32) ),
( (l._31 * r._13) + (l._32 * r._23) + (l._33 * r._33) )
);
}
Насколько я понимаю, эта проблема смущает многих людей. Я думаю, что путаница возникает после того, как вы прочитали учебники по этому предмету, а затем сели перед IDE и написали классы, эти два предмета редко объединяются.
Математическое умножение матриц работает одинаково, независимо от основного порядка столбцов / строк. Как влияет порядок упорядочения столбцов / строк? Создайте эти матрицы. Как вы строите матрицу вращения, например.
Более того:
я должен писать первую структуру следующим образом
Весь основной столбец / строка имеет значение только для массивы ценностей. Главный вопрос столбца / строки о том, как хранить матрицу в виде массива. Если у вас есть массив из 9 значений, а матрица 3×3 хранится в форме главной строки, то во 2-м столбце, индекс 1-й строки будет индексом, начинающимся с нуля 1. В хранилище с основной строкой, 2-й столбец, индекс первой строки будет 3.
Так что посмотри на свой союз. Смысл объединения заключается в том, чтобы получить доступ к одному и тому же поплавку различными способами. _21
Член должен быть 2-й столбец, первый ряд. Если это так, то вы обязаны убедиться, что он отображается в правой части массива. Если массив должен быть главным столбцом, то _21
должен отображаться на то же значение, что и _data[3]
, Если это основной ряд, он должен отображаться в _data[1]
,
Других решений пока нет …