Матричные вращения и преобразования

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

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

Задайте параметрический поверхностный 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

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

Создайте 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 = 

(1000потому что(t)-sin(t)0sin(t)потому что(t))

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

(потому что(t)0sin(t)010-sin(t)0потому что(t))

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

(потому что(t)-sin(t)0sin(t)потому что(t)0001)

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

Во-первых, вращайте поверхность о 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

Вращайтесь о 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

Вращайтесь о 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

Масштабируйтесь и вращайтесь

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

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

(потому что(u)sin(v)sin(u)sin(v)3потому что(v)sin(v))

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

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

R = Rx*Ry*Rz
R = 

(потому что(t)2-потому что(t)sin(t)sin(t)σ1потому что(t)2-sin(t)3-потому что(t)sin(t)sin(t)2-потому что(t)2sin(t)σ1потому что(t)2)где  σ1=потому что(t)sin(t)2+потому что(t)sin(t)

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

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

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

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

simplify(R.'*R)
ans = 

(100010001)

simplify(det(R))
ans = 1