2015-06-08 5 views
1

Я хочу построить 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, Конда, мои окна ноутбук)

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

Everybody забывает о POVray, который очень хорошо обрабатывает 3D. Однако он не отображает каркас, но вы можете использовать полупрозрачную текстуру, чтобы увидеть, что внутри коробки.

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