python: trazando un wireframe cuboide 3D

Quiero trazar 3d cuboid en python.

Entrada: centro (3 puntos para el centro) radio (3 valores de radio, uno para cada dimensión)

Idealmente, debería ser una ttwig de una estructura alámbrica (necesito ver qué hay dentro). No estoy exactamente seguro de cómo hacerlo. Usar python matplotlib o Mayavi está bien.

¡Gracias!

Hasta ahora he probado el siguiente código … pero que solo dibuja un cubo

from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np from itertools import product, combinations fig = plt.figure() ax = fig.gca(projection='3d') ax.set_aspect("equal") #draw cube r = [-1, 1] for s, e in combinations(np.array(list(product(r,r,r))), 2): if np.sum(np.abs(se)) == r[1]-r[0]: ax.plot3D(*zip(s,e), color="b") plt.show() 

Lo que falta en este código es que solo es un cubo (no un cuboide) y solo se centra alrededor de 0 (en realidad quiero proporcionar el centro)

Después de pensar un poco, se me ocurrió esto. Lo que parece correcto. Déjame saber si crees que no es correcto … esta es la forma más sencilla posible sin instalar myavi, pygame, povray (me costó mucho instalarlos en ipython, conda, mi computadora portátil con Windows)

 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np from itertools import product, combinations fig = plt.figure() ax = fig.gca(projection='3d') ax.set_aspect("equal") #draw cube r1 = [-1, 1] r2 = [-2, 2] r3 = [-3, 3] center =[5,5,5] for s, e in combinations(np.array(list(product(r1,r2,r3))), 2): s=np.array(center)+np.array(s) e=np.array(center)+np.array(e) ax.scatter3D(*center, color="r") if np.linalg.norm(se) == 2*r1[1] or np.linalg.norm(se) == 2*r2[1] or np.linalg.norm(se) == 2*r3[1]: print zip(s,e) ax.plot3D(*zip(s,e), color="b") plt.show() 

Aquí hay una gráfica de alambre para un cuboide.

 def plot_cuboid(center, size): """ Create a data array for cuboid plotting. ============= ================================================ Argument Description ============= ================================================ center center of the cuboid, triple size size of the cuboid, triple, (x_length,y_width,z_height) :type size: tuple, numpy.array, list :param size: size of the cuboid, triple, (x_length,y_width,z_height) :type center: tuple, numpy.array, list :param center: center of the cuboid, triple, (x,y,z) """ # suppose axis direction: x: to left; y: to inside; z: to upper # get the (left, outside, bottom) point import numpy as np ox, oy, oz = center l, w, h = size x = np.linspace(ox-l/2,ox+l/2,num=10) y = np.linspace(oy-w/2,oy+w/2,num=10) z = np.linspace(oz-h/2,oz+h/2,num=10) x1, z1 = np.meshgrid(x, z) y11 = np.ones_like(x1)*(oy-w/2) y12 = np.ones_like(x1)*(oy+w/2) x2, y2 = np.meshgrid(x, y) z21 = np.ones_like(x2)*(oz-h/2) z22 = np.ones_like(x2)*(oz+h/2) y3, z3 = np.meshgrid(y, z) x31 = np.ones_like(y3)*(ox-l/2) x32 = np.ones_like(y3)*(ox+l/2) from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fig = plt.figure() ax = fig.gca(projection='3d') # outside surface ax.plot_wireframe(x1, y11, z1, color='b', rstride=1, cstride=1, alpha=0.6) # inside surface ax.plot_wireframe(x1, y12, z1, color='b', rstride=1, cstride=1, alpha=0.6) # bottom surface ax.plot_wireframe(x2, y2, z21, color='b', rstride=1, cstride=1, alpha=0.6) # upper surface ax.plot_wireframe(x2, y2, z22, color='b', rstride=1, cstride=1, alpha=0.6) # left surface ax.plot_wireframe(x31, y3, z3, color='b', rstride=1, cstride=1, alpha=0.6) # right surface ax.plot_wireframe(x32, y3, z3, color='b', rstride=1, cstride=1, alpha=0.6) ax.set_xlabel('X') ax.set_xlim(-100, 100) ax.set_ylabel('Y') ax.set_ylim(-100, 100) ax.set_zlabel('Z') ax.set_zlim(-100, 100) plt.show() def test(): center = [0, 0, 0] length = 32 * 2 width = 50 * 2 height = 100 * 2 plot_cuboid(center, (length, width, height)) if __name__ == '__main__': test() 

Aquí está el resultado. plot cuboide

Me he encontrado con la misma pregunta, y he tratado de dar una respuesta de la siguiente manera.

 def cuboid_data(center, size): """ Create a data array for cuboid plotting. ============= ================================================ Argument Description ============= ================================================ center center of the cuboid, triple size size of the cuboid, triple, (x_length,y_width,z_height) :type size: tuple, numpy.array, list :param size: size of the cuboid, triple, (x_length,y_width,z_height) :type center: tuple, numpy.array, list :param center: center of the cuboid, triple, (x,y,z) """ # suppose axis direction: x: to left; y: to inside; z: to upper # get the (left, outside, bottom) point o = [a - b / 2 for a, b in zip(center, size)] # get the length, width, and height l, w, h = size x = [[o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in bottom surface [o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in upper surface [o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in outside surface [o[0], o[0] + l, o[0] + l, o[0], o[0]]] # x coordinate of points in inside surface y = [[o[1], o[1], o[1] + w, o[1] + w, o[1]], # y coordinate of points in bottom surface [o[1], o[1], o[1] + w, o[1] + w, o[1]], # y coordinate of points in upper surface [o[1], o[1], o[1], o[1], o[1]], # y coordinate of points in outside surface [o[1] + w, o[1] + w, o[1] + w, o[1] + w, o[1] + w]] # y coordinate of points in inside surface z = [[o[2], o[2], o[2], o[2], o[2]], # z coordinate of points in bottom surface [o[2] + h, o[2] + h, o[2] + h, o[2] + h, o[2] + h], # z coordinate of points in upper surface [o[2], o[2], o[2] + h, o[2] + h, o[2]], # z coordinate of points in outside surface [o[2], o[2], o[2] + h, o[2] + h, o[2]]] # z coordinate of points in inside surface return x, y, z def test(): import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np center = [0, 0, 0] length = 32 * 2 width = 50 * 2 height = 100 * 2 import matplotlib.pyplot as plt fig = plt.figure() ax = fig.gca(projection='3d') X, Y, Z = cuboid_data(center, (length, width, height)) ax.plot_surface(X, Y, Z, color='b', rstride=1, cstride=1, alpha=0.1) ax.set_xlabel('X') ax.set_xlim(-100, 100) ax.set_ylabel('Y') ax.set_ylim(-100, 100) ax.set_zlabel('Z') ax.set_zlim(-100, 100) plt.show() if __name__ == '__main__': test() 

Este es el resultado. matplotlib plot cuboid ejemplo

Todo el mundo se olvida de POVray que maneja 3D muy bien. Sin embargo, no procesa alámbrico, pero puede usar una textura semitransparente para ver qué hay dentro de la caja.

 #!/usr/bin/python # -*- coding: utf-8 -*- import os center='-1, -1, -1' radius='1, 1, 1' pov='camera { location <0, 2, -3> look_at <0, 1, 2> }\n\ light_source { <2, 4, -3> color rgb 1*1.5}\n\ background {color rgb <0.00, 0.00, 0.00>}\n\ box {<'+center+'>, < '+radius+'>\n\ pigment { color rgbt <0.67, 1.00, 0.39, 0.80> }\n\ rotate <52, 6, 0>\n\ scale 0.9\n\ translate <0, 1.2, 1>}\n\ ' f=open('scene.pov', 'w') f.write(pov) f.close() os.system('povray +W400 +H300 +A +FN scene.pov') 

Salida “scene.png”

introduzca la descripción de la imagen aquí

Necesitas leer la documentación de povray.