python : plotting a wireframe 3D cuboid

后端 未结 3 1688
遥遥无期
遥遥无期 2020-12-01 23:00

I want to plot 3d cuboid in python.

Input : center (3 points for the center) radius (3 radius values, one for each dimension)

Ideally it should be a wirefra

相关标签:
3条回答
  • 2020-12-01 23:18

    Everybody forgets about POVray that handles 3D very well. It doesn't render wireframe, though, but you can use a half-transparent texture to see what is inside of the box.

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

    Output "scene.png"

    enter image description here

    You need to read povray's documentation.

    0 讨论(0)
  • 2020-12-01 23:24

    Here is a wireframe plot for a cuboid.

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

    Here is the result.

    0 讨论(0)
  • 2020-12-01 23:26

    I have encountered the same question, and tried to give a answer as follows.

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

    This is the result:

    0 讨论(0)
提交回复
热议问题