Этот пример показывает, как выполнить вращения и преобразования в 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
Создайте матрицы 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 =
Ry = [cos(t) 0 sin(t); 0 1 0; -sin(t) 0 cos(t)]
Ry =
Rz = [cos(t) -sin(t) 0; sin(t) cos(t) 0; 0 0 1]
Rz =
Сначала поверните поверхность вокруг 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 =
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 =
Используйте матрицу поворота, чтобы найти новые координаты.
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 =
simplify(det(R))
ans =