2013-06-08 3 views
0

Я смотрел на этот материал так долго, что моя голова в размытом оцепенении, но я думаю, что получаю его. Я использую библиотеку матрицы, а матрица имеет свои данные, хранящиеся как:Является ли эта функция строкой?

struct Matrix4{ 
    vec4 x; 
    vec4 y; 
    vec4 z; 
    vec4 w; 
..... functions 
} 

vec4 просто структура с ее данными, как:

T x; 
T y; 
T z; 
T w; 

(T обычно является float)

ключевой вопрос, вероятно, ответил на это:

Matrix4 operator * (const Matrix4& b) const 
{ 
    Matrix4 m; 
    m.x.x = x.x * b.x.x + x.y * b.y.x + x.z * b.z.x + x.w * b.w.x; 
    m.x.y = x.x * b.x.y + x.y * b.y.y + x.z * b.z.y + x.w * b.w.y; 
    m.x.z = x.x * b.x.z + x.y * b.y.z + x.z * b.z.z + x.w * b.w.z; 
    m.x.w = x.x * b.x.w + x.y * b.y.w + x.z * b.z.w + x.w * b.w.w; 
    m.y.x = y.x * b.x.x + y.y * b.y.x + y.z * b.z.x + y.w * b.w.x; 
    m.y.y = y.x * b.x.y + y.y * b.y.y + y.z * b.z.y + y.w * b.w.y; 
    m.y.z = y.x * b.x.z + y.y * b.y.z + y.z * b.z.z + y.w * b.w.z; 
    m.y.w = y.x * b.x.w + y.y * b.y.w + y.z * b.z.w + y.w * b.w.w; 
    m.z.x = z.x * b.x.x + z.y * b.y.x + z.z * b.z.x + z.w * b.w.x; 
    m.z.y = z.x * b.x.y + z.y * b.y.y + z.z * b.z.y + z.w * b.w.y; 
    m.z.z = z.x * b.x.z + z.y * b.y.z + z.z * b.z.z + z.w * b.w.z; 
    m.z.w = z.x * b.x.w + z.y * b.y.w + z.z * b.z.w + z.w * b.w.w; 
    m.w.x = w.x * b.x.x + w.y * b.y.x + w.z * b.z.x + w.w * b.w.x; 
    m.w.y = w.x * b.x.y + w.y * b.y.y + w.z * b.z.y + w.w * b.w.y; 
    m.w.z = w.x * b.x.z + w.y * b.y.z + w.z * b.z.z + w.w * b.w.z; 
    m.w.w = w.x * b.x.w + w.y * b.y.w + w.z * b.z.w + w.w * b.w.w; 
    return m; 
} 

В основной системе с колонками operator* следует считать, что верхняя строка матрицы слева равна , но не в непрерывной памяти, так как в ней хранится первый элемент каждого столбца. Эта функция явно обрабатывает первую строку левой матрицы (матрицу *this) как непрерывную, что подразумевает, что это матричная библиотека строк, правда?

После того, как я просмотрел этот материал так долго, я понял, что единственный способ действительно определить, является ли библиотека основным столбцом или строкой-строкой, - это посмотреть, как она обрабатывает умножение в отношении того, как она излагает свои данные ,

Невозможно, чтобы диагностировать мой вопрос, матрица перевода, предоставляемая библиотекой для преобразования 3d-трансляции, помещает данные x, y, z в окончательный vec4. Но эти данные могут находиться в этом месте либо в колонке-майоре, либо в строковой системе, так что это, вероятно, тривиальное доказательство.

ответ

0

Столбец против главной строки действительно является вопросом интерпретации, так как если бы они были основными матрицами столбцов, код умножения матрицы выглядел бы точно так же. то есть элементы vec4 могут просто быть интерпретированы как как столбцы.

Это говорит о том, что матрицы столбцов являются злыми и неправильными, потому что так я узнал линейную алгебру :) Вектор - это матрица 4x1 (столбец), а векторное преобразование: 4x4 x 4x1 = 4x1. Внешние термины дают размеры, внутренние термины делают его законным. 1x4 x 4x4 = 1x4 является законным, но не имеет места в хорошо упорядоченной вселенной. Как левые координатные пространства.

Мне всегда нравились these сообщения от различных выпускников SGI.

+0

Рассмотрите эту функцию при написании кода. A * B может использовать только строки из A. Поэтому vec4 должен быть строкой. – johnbakers

+0

@Fellowshee - Q.E.D. Похоже, вы ответили на свой вопрос. –

+0

Я искал подтверждения этого, и ваш ответ показался мне неправильным. – johnbakers

Смежные вопросы