Revolution solid с MatplotLib Python - PullRequest
       15

Revolution solid с MatplotLib Python

2 голосов
/ 10 апреля 2020

Я пытаюсь создать bottle как революцию solid, используя MatplotLib. У меня есть следующие очки: Изображение координат

Которые с точки зрения координат:

coords = [(0.00823433249299356, 0.06230346394288128),
 (0.04086905251958573, 0.0648935210878489),
 (0.08386400112604843, 0.0648935210878489),
 (0.11753474401062763, 0.06541153251684242),
 (0.14239929260231693, 0.05712334965294601),
 (0.19109236692770842, 0.05401528107898486),
 (0.2278711783862488, 0.05142522393401722),
 (0.24133947554008045, 0.04158300678314021)]

Полином (более или менее точный):

Lambda(x, -19493.7965633925*x**6 + 13024.3747084876*x**5 - 3228.16456296349*x**4 + 368.816080918066*x**3 - 20.500262217588*x**2 + 0.545840273670868*x + 0.0590464366057008)

Который я получаю по:

# Getting the polynomial:
z = np.polyfit(xdata, ydata, 6)
# Being xdata and ydata the 2 vector from the coordinates
x = sp.symbols('x', real=True) 
P = sp.Lambda(x,sum((a*x**i for i,a in enumerate(z[::-1]))))
print(P)

Точка описывает контур bottle (бросьте ваше воображение), являющегося bottle в плоскости XY. Как я могу получить из этой кривой solid оборота, воссоздающего bottle?

Моя цель состоит в том, чтобы иметь возможность вращать генераторную кривую и создавать solid оборота, что я я пробовал это:

# Create the polynomial
pol = sp.lambdify(x,P(x),"numpy")
# Create the matrix of points
X = np.linspace(xdata[0], xdata[-1], 50)
Y = pol(X)
X, Y = np.meshgrid(X, Y)

# As long as a bottle is no more than a big amount of small cylinders, my 
# equation should be more or less like:
# Z = x**2 + y** -R**2
# So we create here the equation
Z = X**2 + Y**2 - (Y - 0.0115)**2

# We create the #D figure
fig = plt.figure()
ax = plt.axes(projection="3d")
# And we representate it
surf = ax.plot_surface(X, Y, Z)  

# We change te labels
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.set_zlabel('$z$')

# And show the figure
plt.show()

Проблема в том, что я больше не bottle (и я думаю, потому что, как я использую plot_surface (я не получаю очень хорошо, как использовать его, читая документацию).

То, что я получил, это: Изображение изображения . Сначала я подумал, что это проблема, связанная с масштабированием, но я изменил его и цифра такая же

1 Ответ

2 голосов
/ 10 апреля 2020

Я напишу ответ unutbu на аналогичный вопрос.

import numpy as np 
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

# grab more points between your coordinates, say 100 points
u = np.linspace(0.00823433249299356, 0.24133947554008045, 100)

def polynomial(x):
    return -19493.7965633925*x**6 + 13024.3747084876*x**5 - 3228.16456296349*x**4 + 368.816080918066*x**3 - 20.500262217588*x**2 + 0.545840273670868*x + 0.0590464366057008

v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)

X = U
Y1 = polynomial(X)*np.cos(V)
Z1 = polynomial(X)*np.sin(V)

# Revolving around the axis
Y2 = 0*np.cos(V)
Z2 = 0*np.sin(V)

ax.plot_surface(X, Y1, Z1, alpha=0.3, color='red', rstride=6, cstride=12)
ax.plot_surface(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)

# set the limits of the axes
ax.set_xlim3d(-0.3, 0.3) 
ax.set_ylim3d(-0.3, 0.3) 
ax.set_zlim3d(-0.3, 0.3) 

plt.show()

enter image description here

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