#python #matplotlib #plot #3d #geometry-surface
Вопрос:
Я пытаюсь построить 3D-усеченную пирамиду (поверхностный график) в программе на python, где геометрия усеченной пирамиды задана изображениями плоскости ниже:
Где все переменные B, L, альфа, бета… будут указаны в моей программе (обратите внимание, что альфа не равна бета, как в обычных усеченных числах). Кто-нибудь поможет мне с каким-либо советом о том, как я могу это сделать? Заранее благодарю вас!
Ответ №1:
Что-то вроде этого?
import numpy as np
import matplotlib.pyplot as plt
def get_vertices(L, B, I, alpha, beta):
P = np.empty((8,3), dtype=float)
Ind = np.array([4,5,6,7])
#Ind = np.array([0,2,4,6])
P[Ind, 0] = L/2 I*np.tan(np.pi*alpha/180)
P[Ind, 1] = B/2 I*np.tan(np.pi*beta/180)
P[Ind, 2] = I
P[5, 0] = - P[5, 0]
P[7, 1] = - P[7, 1]
P[6, [0,1]] = - P[6, [0,1]]
Ind = Ind - 4
P[Ind, 0] = L/2
P[Ind, 1] = B/2
P[Ind, 2] = 0
P[1, 0] = - P[1, 0]
P[3, 1] = - P[3, 1]
P[2, [0,1]] = - P[2, [0,1]]
return P
def draw(P):
l_x = -7
r_x = 7
l_y = -7
r_y = 7
l_z = -0.5
r_z = 7
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set_xlim((l_x, r_x))
ax.set_ylim((l_y, r_y))
ax.set_zlim((l_z, r_z))
Ind = np.array([[0,1], [1,2], [2,3], [3,0]])
for i in Ind:
ax.plot(P[i, 0], P[i, 1], P[i, 2], 'r-')
Ind = np.array([[4,5], [5,6], [6,7], [7,4]])
for i in Ind:
ax.plot(P[i, 0], P[i, 1], P[i, 2], 'r-')
Ind = np.array([[0,4], [1,5], [2,6], [3,7]])
for i in Ind:
ax.plot(P[i, 0], P[i, 1], P[i, 2], 'r-')
ax.plot(P[:,0], P[:,1], P[:,2], 'bo')
plt.show()
return None
L = 8
B = 5
I = 4
alpha = 15
beta = 30
ful = get_vertices(L, B, I, alpha, beta)
draw(ful)