Вращений и преобразований матриц

Этот пример показывает, как выполнить вращения и преобразования в 3D с помощью Toolbox™ Symbolic Math и матриц.

Определите и постройте параметрическую поверхность

Задайте параметрическую поверхность x(u,v), y(u,v), z(u,v) следующим образом.

syms u v
x = cos(u)*sin(v);
y = sin(u)*sin(v);
z = cos(v)*sin(v);

Постройте график поверхности с помощью fsurf.

fsurf(x,y,z)
axis equal

Figure contains an axes. The axes contains an object of type parameterizedfunctionsurface.

Создайте матрицы вращения

Создайте матрицы 3 на 3 Rx, Ry, и Rz представление поворотов плоскости на угол t о x-, y-, и z-ось, соответственно.

syms t

Rx = [1 0 0; 0 cos(t) -sin(t); 0 sin(t) cos(t)]
Rx = 

(1000cos(t)-sin(t)0sin(t)cos(t))[sym (1), sym (0), sym (0); sym (0), cos (t), -sin (t); sym (0), sin (t), cos (t)]

Ry = [cos(t) 0 sin(t); 0 1 0; -sin(t) 0 cos(t)]
Ry = 

(cos(t)0sin(t)010-sin(t)0cos(t))[cos (t), sym (0), sin (t); sym (0), sym (1), sym (0); -sin (t), sym (0), cos (t)]

Rz = [cos(t) -sin(t) 0; sin(t) cos(t) 0; 0 0 1]
Rz = 

(cos(t)-sin(t)0sin(t)cos(t)0001)[cos (t), -sin (t), sym (0); sin (t), cos (t), sym (0); sym (0), sym (0), sym (1)]

Вращайте вокруг каждой оси в трёх размерностях

Сначала поверните поверхность вокруг x-ось на 45 степени против часовой стрелки.

xyzRx = Rx*[x;y;z];
Rx45 = subs(xyzRx, t, pi/4);

fsurf(Rx45(1), Rx45(2), Rx45(3))
title('Rotating by \pi/4 about x, counterclockwise')
axis equal

Figure contains an axes. The axes with title Rotating by \pi/4 about x, counterclockwise contains an object of type parameterizedfunctionsurface.

Вращайте вокруг z-ось на 90 степени по часовой стрелке.

xyzRz = Rz*Rx45;
Rx45Rz90 = subs(xyzRz, t, -pi/2);

fsurf(Rx45Rz90(1), Rx45Rz90(2), Rx45Rz90(3))
title('Rotating by \pi/2 about z, clockwise')
axis equal

Figure contains an axes. The axes with title Rotating by \pi/2 about z, clockwise contains an object of type parameterizedfunctionsurface.

Вращайте вокруг y-ось на 45 степени по часовой стрелке.

xyzRy = Ry*Rx45Rz90;
Rx45Rz90Ry45 = subs(xyzRy, t, -pi/4);

fsurf(Rx45Rz90Ry45(1), Rx45Rz90Ry45(2), Rx45Rz90Ry45(3))
title('Rotating by \pi/4 about y, clockwise')
axis equal

Figure contains an axes. The axes with title Rotating by \pi/4 about y, clockwise contains an object of type parameterizedfunctionsurface.

Масштабирование и вращение

Масштабируйте поверхность на множитель 3 вдоль z-ось. Можно умножить выражение для z по 3, z = 3*z. Более общий подход состоит в том, чтобы создать масштабирующую матрицу, а затем умножить масштабирующую матрицу на вектор координат.

S = [1 0 0; 0 1 0; 0 0 3];
xyzScaled = S*[x; y; z]
xyzScaled = 

(cos(u)sin(v)sin(u)sin(v)3cos(v)sin(v))[cos (u) * sin (v); sin (u) * sin (v); 3 * cos (v) * sin (v)]

fsurf(xyzScaled(1), xyzScaled(2), xyzScaled(3))
title('Scaling by 3 along z')
axis equal

Figure contains an axes. The axes with title Scaling by 3 along z contains an object of type parameterizedfunctionsurface.

Поверните масштабированную поверхность вокруг x-, y-, и z-ось на 45 степени по часовой стрелке, по порядку z, затем y, затем x. Матрица вращения для этого преобразования следующая.

R = Rx*Ry*Rz
R = 

(cos(t)2-cos(t)sin(t)sin(t)σ1cos(t)2-sin(t)3-cos(t)sin(t)sin(t)2-cos(t)2sin(t)σ1cos(t)2)where  σ1=cos(t)sin(t)2+cos(t)sin(t)[cos (t) ^ 2, -cos (t) * sin (t), sin (t); cos (t) * sin (t) ^ 2 + cos (t) * sin (t), cos (t) ^ 2 - sin (t) ^ 3, -cos (t) * sin (t); sin (t) ^ 2 - cos (t) ^ 2 * sin (t), cos (t) * sin (t) ^ 2 + cos (t) * sin (t), cos (t) ^ 2]

Используйте матрицу поворота, чтобы найти новые координаты.

xyzScaledRotated = R*xyzScaled;
xyzSR45 = subs(xyzScaledRotated, t, -pi/4);

Постройте график поверхности.

fsurf(xyzSR45(1), xyzSR45(2), xyzSR45(3))
title('Rotating by \pi/4 about x, y, and z, clockwise')
axis equal

Figure contains an axes. The axes with title Rotating by \pi/4 about x, y, and z, clockwise contains an object of type parameterizedfunctionsurface.

Проверяйте свойства матрицы вращения R

Матрицы вращения являются ортогональными матрицами. Таким образом, транспонирование R является также его обратной и определяющим R равен 1.

simplify(R.'*R)
ans = 

(100010001)[sym (1), sym (0), sym (0); sym (0), sym (1), sym (0); sym (0), sym (0), sym (1)]

simplify(det(R))
ans = 1sym (1)
Для просмотра документации необходимо авторизоваться на сайте