2015-06-08 206 views
1

我想在python中绘制3d立方体。python:绘制一个线框3D立方体

输入: 中心(3分中心) 半径(半径3倍的值,每一个维度)

理想情况下,应该是一个线框图(我需要看什么里面)。我是不是确切地说如何去做这件事。使用python matplotlib或Mayavi很好。

谢谢!

到目前为止,我已经尝试下面的代码..但只有绘制一个立方体

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(s-e)) == r[1]-r[0]: 
     ax.plot3D(*zip(s,e), color="b") 
plt.show() 

什么在此代码所缺少的是,它只有一个立方体(不是长方体),它围绕0的唯一中心(我真的想提供这个中心)

想了一下,我想出了这个。这似乎是正确的。让我知道,如果你认为它不是正确的...这是无需安装myavi,pygame的,对的povray最简单的方式(我的日子不好过的IPython上,畅达,我的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(s-e) == 2*r1[1] or np.linalg.norm(s-e) == 2*r2[1] or np.linalg.norm(s-e) == 2*r3[1]: 
     print zip(s,e) 
     ax.plot3D(*zip(s,e), color="b") 
plt.show() 
+0

我试过这个链接...这只是一个多维数据集http://stackoverflow.com/questions/11140163/python-matplotlib-plotting-a-3d-cube-a-sphere-and-a-vector ....我不完全确定如何修改它是一个长方体,我给3个中心和3个半径 – mathopt

+0

你可以通过以代码的形式告诉我们你已经试过的更具体的方法 – aestrivex

+0

我包含了代码在这个问题上尝试过。 – mathopt

回答

1

这里是一个长方体的线框图。

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() 

这是结果。 plot cuboid

2

大家忘记了处理3D很好的POVray。虽然它不渲染线框,但是您可以使用半透明纹理来查看框内的内容。

#!/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') 

输出 “scene.png”

enter image description here

您需要的povray阅读的文档。

2

我遇到了同样的问题,并试图给出如下答案。

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() 

这就是结果。 matplotlib plot cuboid example