Трансформация координат
Вы можете применять к объекту различные операции преобразования координат: перемещение, масштабирование, поворот, отзеркаливание с помощью матрицы преобразования 4 х 4, представленной объектом Matrix3d и методом TransformBy. Вы также можете использовать метод GetTransformedCopy для создания копии объекта Matrix3d, а затем применить преобразование координат для данной копии. Объект Matrix3d является частью пространства имен Geometry.
Первые 3 колонки матрицы задают масштаб и поворот. Четвертая колонка матрицы задает вектор перемещения. Ниже приведена табличная запись матрицы, первая буква R (Rotation) - угол поворота, T (Translation) - вектор перемещения.
R00 R01 R02 T0
R10 R11 R12 T1
R20 R21 R22 T2
0 0 0 1
Чтобы применить к объекту трансформацию сперва инициализируйте объект Matrix3d (например, используя массив чисел типа double, единичную матрицу Matrix3d.Identity или с матрицы, которая представляет систему координат World или систему координат пользователя). После инициализации вы можете использовать функции объекта Matrix3d для задания масштабирования, поворота или смещения матрицы.
После завершения создания матрицы преобразования примените её к объекту с помощью метода TransformBy.
Пример матрицы трансформации для простого поворота
Пример ниже описывает матрицу трансформации координат для поворота на 90 градусов вокруг точки (0, 0, 0).
0.0 -1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
Код ниже содержит объявление указанной матрицы, а также альтернативный вариант её задания через вызов специальных методов:
// Задание матрицы напрямую
double[] dMatrix = new double[16];
dMatrix[0] = 0.0;
dMatrix[1] = -1.0;
dMatrix[2] = 0.0;
dMatrix[3] = 0.0;
dMatrix[4] = 1.0;
dMatrix[5] = 0.0;
dMatrix[6] = 0.0;
dMatrix[7] = 0.0;
dMatrix[8] = 0.0;
dMatrix[9] = 0.0;
dMatrix[10] = 1.0;
dMatrix[11] = 0.0;
dMatrix[12] = 0.0;
dMatrix[13] = 0.0;
dMatrix[14] = 0.0;
dMatrix[15] = 1.0;
Matrix3d acMat3d = new Matrix3d(dMatrix);
// Задание матрицы через специальные методы
Document acDoc;
Matrix3d curUCSMatrix = acDoc.Editor.CurrentUserCoordinateSystem;
CoordinateSystem3d curUCS = curUCSMatrix.CoordinateSystem3d;
Matrix3d acMat3d = new Matrix3d();
acMat3d = Matrix3d.Rotation(Math.PI / 2,
curUCS.Zaxis,
new Point3d(0, 0, 0));
Примеры матриц трансформации для составных преобразований
Матрица поворота: 45 градусов вокруг точки (5, 5, 0)
0.707107 -0.707107 0.0 5.0
0.707107 0.707107 0.0 -2.071068
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
Матрица сдвига: перемещение объекта на вектор (10, 10, 0)
1.0 0.0 0.0 10.0
0.0 1.0 0.0 10.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
Матрица масштабирования: увеличение масштаба в 10 раз по осям X, Y вокруг точки (0, 0, 0)
10.0 0.0 0.0 0.0
0.0 10.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
Матрица масштабирования: увеличение масштаба в 10 раз по всем осям вокруг точки (2, 2, 0)
10.0 0.0 0.0 -18.0
0.0 10.0 0.0 -18.0
0.0 0.0 10.0 0.0
0.0 0.0 0.0 1.0