Функции acedDragGen (), acedGrVecs (), acedNEntSelP (), и acedXformSS () умножают входные векторы на матрицу преобразования, определенную как 4x4 массив реальных значений.
typedef ads_real ads_matrix [4] [4];
Первые три столбца матрицы определяют масштабирование и вращение. Четвертый столбец матрицы - вектор сдвига. ObjectARX определяет символ T, чтобы представить координату этого вектора, следующим образом:
#define T 3
Матрица может быть выражена следующим образом:
М. 00 |
М. 01 |
М. 02 |
М. 03 |
М. 10 |
М. 11 |
М. 12 |
М. 13 |
М. 20 |
М. 21 |
М. 22 |
М. 23 |
0.0 |
0.0 |
0.0 |
1.0 |
Следующая функция инициализирует единичную матрицу.
void ident_init(ads_matrix id)
{
int i, j;
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
id[i][j] = 0.0;
for (i=0; i<=3; i++)
id[i][i] = 1.0;
}
Функции, которые передают параметры типа ads_matrix, обращаются с точкой как вектор столбца измерения 4. Точка выражена в гомогенных координатах, где четвертый элемент вектора точки - коэффициент масштаба, который обычно устанавливается в 1.0. Конечная{*заключительная*} строка матрицы имеет номинальное значение [0,0,0,1]; это игнорируется функциями тот проход ads_matrix параметры. В этом случае, следующие матричные результаты умножения от приложения преобразования к точке:
X ' |
М.00 |
М.01 |
М.02 |
М.03 |
X |
||
Y ' |
= |
М.10 |
М.11 |
М.12 |
М.13 |
x |
Y |
Z ' |
М.20 |
М.21 |
М.22 |
М.23 |
Z |
||
1.0 |
0.0 |
0.0 |
0.0 |
1.0 |
1.0 |
Это умножение дает нам индивидуальные координаты точки следующим образом:
X ' = М. 00 X + М. 01 Y + М. 02 Z + М. 03 (1.0)
Y ' = М. 10 X + М. 11 Y + М. 12 Z + М. 13 (1.0)
Z ' = М. 20 X + М. 21 Y + М. 22 Z + М. 23 (1.0)
Как этот показ уравнений, коэффициент масштаба и последняя строка матрицы не имеет никакой эффект и игнорируется. Это известно как афинное преобразование.