Я советую вам взглянуть на матрицу вращения. topi c из Википедии - хорошее начало! Давайте реализуем это:
Мы можем управлять 3 поворотами по 3 осям.
Рабочий процесс :
- Сначала мы должны быть уверены, что имеем дело с углом радиана.
- Во-вторых, нам нужно реализовать матрицу вращения
- Затем мы вычисляем вращение, используя
numpy.dot
np.array([np.dot(rotation_matrix, vect) for vect in zip(X, Y, Z)])
- Окончательный график результатов
Полный код :
# Modules
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from math import cos, sin, pi
# Input angles
angle_x = 90
angle_y = 90
angle_z = 90
# Conversion radian
theta_x = angle_x*pi/180
theta_y = angle_y*pi/180
theta_z = angle_z*pi/180
# rotation matrix
R_x = np.array([[1, 0 , 0 ],
[0, cos(theta_x), -sin(theta_x)],
[0, sin(theta_x), cos(theta_x)]])
R_y = np.array([[ cos(theta_y), 0, sin(theta_y)],
[ 0 , 1, 0 ],
[-sin(theta_y), 0, cos(theta_y)]])
R_z = np.array([[cos(theta_z), -sin(theta_z), 0],
[sin(theta_z), cos(theta_z), 0],
[0 , 0 , 1]])
# Compute initial curve
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
Z = np.linspace(-2, 2, 100)
r = Z**2 + 1
X = r * np.sin(theta)
Y = r * np.cos(theta)
# Compute rotation
rotated_x = np.array([np.dot(R_x, vect) for vect in zip(X, Y, Z)])
rotated_y = np.array([np.dot(R_y, vect) for vect in zip(X, Y, Z)])
rotated_z = np.array([np.dot(R_z, vect) for vect in zip(X, Y, Z)])
# Extras for plotting
def addExtras(ax):
ax.plot(X, Y, Z, label='Initial curve')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
plt.legend()
# Create figure
fig = plt.figure()
# Create subplots
ax = fig.add_subplot(2, 2, 1, projection='3d')
addExtras(ax)
ax = fig.add_subplot(2, 2, 2, projection='3d')
ax.plot(rotated_x[:, 0], rotated_x[:, 1], rotated_x[:, 2], label='X+90° rotation curve')
addExtras(ax)
ax = fig.add_subplot(2, 2, 3, projection='3d')
ax.plot(rotated_y[:, 0], rotated_y[:, 1], rotated_y[:, 2], label='Y+90° rotation curve')
addExtras(ax)
ax = fig.add_subplot(2, 2, 4, projection='3d')
ax.plot(rotated_z[:, 0], rotated_z[:, 1], rotated_z[:, 2], label='Z+90° rotation curve')
addExtras(ax)
# Show results
plt.show()
Выход