Как построить цилиндр с сеткой на нем? - PullRequest
2 голосов
/ 30 марта 2019

Я хотел бы построить цилиндр с центром в (0,0,0), учитывая его высоту (h = 40) и радиус (r = 20). Я также хочу создать сетку на ее поверхности.

Моя проблема заключается в следующем: когда я пытаюсь построить верхнюю и нижнюю части моего цилиндра, они отображаются в виде квадратов на моей фигуре, а не в виде дисков. Кроме того, когда я устанавливаю сетку для боковой части, используя функцию каркаса из Axes3D (matplotlib), по какой-то причине сетка появляется в верхней части, а квадраты не имеют постоянного размера.

fig1 = plt.figure(figsize = (10,10)) #On nomme la figure
env = fig1.add_subplot(111, projection='3d') #On crée le volume 3D avec quadrillage et axes


# Parois latérales

no_values = 1000
phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_walls = R * np.cos(phi_cyl) #Valeurs de X prises par le cylindre externe
z_walls = np.linspace(-h/2, h/2, no_values)
x2D_walls, z2D_walls = np.meshgrid(x_walls, z_walls)
y2D_walls = np.sqrt(R**2 - x2D_walls**2)
env.plot_surface(x2D_walls, y2D_walls, z2D_walls, color='k', alpha=0.03)
env.plot_surface(x2D_walls, -y2D_walls, z2D_walls, color='k', alpha=0.03,)
env.plot_wireframe(x2D_walls, y2D_walls, z2D_walls, rstride=2, cstride =2)
env.plot_wireframe(x2D_walls, -y2D_walls, z2D_walls, rstride=2, cstride =2)


#Plafond

phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_ceiling = R * np.cos(phi_cyl)
y_ceiling = R * np.sin(phi_cyl)
x2D_ceiling, y2D_ceiling = np.meshgrid(x_ceiling, y_ceiling)
z2D_ceiling = np.ones((len(x_ceiling),len(y_ceiling)))* h/2
env.plot_surface(x2D_ceiling, y2D_ceiling, z2D_ceiling, color='k', alpha=0.03)
env.plot_wireframe(x2D_ceiling, y2D_ceiling, z2D_ceiling, rstride=2, cstride =2)


#Sol

phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_floor = R * np.cos(phi_cyl)
y_floor = R * np.sin(phi_cyl)
x2D_floor, y2D_floor = np.meshgrid(x_floor, y_floor)
z2D_floor = - np.ones((len(x_floor),len(y_floor)))* h/2
env.plot_surface(x2D_floor, y2D_floor, z2D_floor, color='k', alpha=0.03)
env.plot_surface(x2D_floor, y2D_floor, z2D_floor, color='k', alpha=0.03, rstride=2, cstride=2)



plt.title('Détecteur T2K')
env.set_xlabel('Profondeur [m]')
env.set_ylabel('Largeur [m]')
env.set_zlabel('Hauteur [m]')
plt.show()
plt.savefig("Cuve")

Я хотел бы получить сетку с квадратами размером 0,5 * 0,5 и, наконец, закрыть свой цилиндр. Спасибо за вашу помощь

1 Ответ

0 голосов
/ 31 марта 2019

Таким образом, сетка сетки - это то, что заставляет вас иметь прямоугольную сетку в верхней и нижней частях вашего цилиндра, потому что x_ceiling и y_ceiling будут определены как -20, а положительные 20. Вы можете использовать np.outer для рисования кругов. на верхней и нижней границе, но это помещает круг в тип полярных координат, который не дает .5x.5 коробки. Мне не удалось найти другой обходной путь, поэтому, возможно, у кого-то будет лучший ответ, но это может быть временным решением.

from mpl_toolkits.mplot3d import Axes3D
fig1 = plt.figure(figsize = (10,10)) #On nomme la figure
env = fig1.add_subplot(111, projection='3d') #On crée le volume 3D avec quadrillage et axes

R=20.
h=40.
# Parois latérales

no_values = 100.
phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_walls = R * np.cos(phi_cyl) #Valeurs de X prises par le cylindre externe
z_walls = np.linspace(-h/2, h/2, no_values)
x2D_walls, z2D_walls = np.meshgrid(x_walls, z_walls)
y2D_walls = np.sqrt(R**2 - x2D_walls**2)


env.plot_surface(x2D_walls, y2D_walls, z2D_walls, color='k', alpha=0.03)
env.plot_surface(x2D_walls, -y2D_walls, z2D_walls, color='k', alpha=0.03,)
env.plot_wireframe(x2D_walls, y2D_walls, z2D_walls, rstride=2, cstride =2)
env.plot_wireframe(x2D_walls, -y2D_walls, z2D_walls, rstride=2, cstride =2)


#Plafond

phi_cyl = np.linspace(0, 2*np.pi, no_values)

#Set the radii intervals for the circle
Rs = np.arange(0,R+1,1)

x_ceiling = np.outer(Rs, np.cos(phi_cyl))
y_ceiling = np.outer(Rs, np.sin(phi_cyl))

z2D_ceiling = np.ones((y_ceiling.shape))* h/2.
env.plot_surface(x_ceiling, y_ceiling, z2D_ceiling, color='k', alpha=0.03)
env.plot_wireframe(x_ceiling, y_ceiling, z2D_ceiling, rstride=2, cstride =2)


#Sol

phi_cyl = np.linspace(0, 2*np.pi, no_values)
Rs = np.arange(0,R+1,1)
x_floor = np.outer(Rs, np.cos(phi_cyl))
y_floor = np.outer(Rs, np.sin(phi_cyl))

z2D_floor = np.ones((y_floor.shape))* -h/2.
env.plot_surface(x_floor, y_floor, z2D_floor, color='k', alpha=0.03)
env.plot_wireframe(x_floor, y_floor, z2D_floor, rstride=2, cstride =2)



plt.show()

Это даст следующий рисунок:

enter image description here

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