Как повернуть построенные данные? - PullRequest
1 голос
/ 11 апреля 2020

Как повернуть построенную кривую на 90 градусов, пожалуйста? Можно ли установить, что результат ax.plot (x, y, z) должен поворачиваться примерно на 90 градусов? Спасибо

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')
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)
ax.plot(x, y, z, label='parametric curve')
plt.show()

enter image description here

1 Ответ

1 голос
/ 13 апреля 2020

Я советую вам взглянуть на матрицу вращения. 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()

Выход enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...