Матрицы Преобразования
Функции 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)
Как этот показ уравнений, коэффициент масштаба и последняя строка матрицы не имеет никакой эффект и игнорируется. Это известно как афинное преобразование.
ПРИМЕЧАНИЕ, чтобы преобразовать вектор скорее чем точка, не добавьте в векторе сдвига М3 М13 М23 (от четвертого столбца матрицы преобразования).
Следующая функция осуществляет предыдущие уравнения, чтобы преобразовать единственную точку:
void xformpt(xform, pt, newpt)
ads_matrix xform;
ads_point pt, newpt;
{
int i, j;
newpt[X] = newpt[Y] = newpt[Z] = 0.0;
for (i=X; i<=Z; i++) {
for (j=X; j<=Z; j++)
newpt[i] += xform[i][j] * pt[j];
// Add the translation vector.
newpt[i] += xform[i][T];
}
}
Следующее рисунок суммирует некоторые основные геометрические преобразования.
( Значения в ads_matrix - фактически ads_real, но им показывают здесь как целые числа для удобочитаемости и соответствовать математическому соглашению.)
1 |
0 |
0 |
0 |
1 |
0 |
0 |
TX |
SX |
0 |
0 |
0 |
cos |
-sin |
0 |
0 |
|||
0 |
1 |
0 |
0 |
0 |
1 |
0 |
TY |
0 |
SY |
0 |
0 |
sin |
cos |
0 |
0 |
|||
0 |
0 |
1 |
0 |
0 |
0 |
1 |
TZ |
0 |
0 |
SZ |
0 |
0 |
0 |
1 |
0 |
|||
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
AcedXformSS () функция — в отличие от acedDragGen(), acedGrVecs(), или acedNEntSelP() функции — требует, чтобы матрица делала однородное масштабирование. То есть в матрице преобразования, которую Вы проходите к acedXformSS (), элементы в векторе масштабирования S X S Y S Z, должны весь быть равными; в матричном примечании, М. 00 = М. 11 = М. 22. Трехмерное вращение - слегка различный случай, как показано в следующем рисунке:
cos |
-sin |
0 |
0 |
1 |
0 |
0 |
0 |
cos |
0 |
sin |
0 |
||
sin |
cos |
0 |
0 |
0 |
cos |
-sin |
0 |
0 |
1 |
0 |
0 |
||
0 |
0 |
1 |
0 |
0 |
sin |
cos |
0 |
-sin |
0 |
cos |
0 |
||
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
rotation in the XY plane rotation in the YZ plane rotation in the XY plane
Для однородных вращений, 3x3 субматрица, разграниченная [0,0] и [2,2] - orthonormal. То есть каждая строка - вектор модуля и перпендикулярна к другим строкам; скалярное (точечное) программа двух строк нулевое. Столбцы - также векторы модуля, которые являются перпендикулярными к друг другу. Программа orthonormal
матрицы и ее, чтобы переместить равняется единичной матрице. Два дополнительных вращения не имеют никакого результирующего влияния.
Сложные преобразования могут быть выполнены, объединяя{*комбинируя*} (или составляя) значения нетождества в единственной{*отдельной*} матрице.
ОБРАТИТЕ ВНИМАНИЕ На acedTablet () функция использует 3x3 матрицу, чтобы преобразовать 2-ые точки. AcedNEntSel () функция использует 4x3 матрицу преобразования, которая является подобной 4x4 матрица преобразования, но это обращается с точкой как строка.