代码之家  ›  专栏  ›  技术社区  ›  Nico Schlömer David Maze

高效绘制多个球体

  •  4
  • Nico Schlömer David Maze  · 技术社区  · 7 年前

    我需要在一张图片中绘制许多大小球体。下面的代码可以运行,但运行时间非常长。

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import numpy
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.set_aspect('equal')
    
    u = numpy.linspace(0, 2*numpy.pi, 100)
    v = numpy.linspace(0, numpy.pi, 100)
    x = numpy.outer(numpy.cos(u), numpy.sin(v))
    y = numpy.outer(numpy.sin(u), numpy.sin(v))
    z = numpy.outer(numpy.ones(numpy.size(u)), numpy.cos(v))
    
    for k in range(200):
        c = numpy.random.rand(3)
        r = numpy.random.rand(1)
        ax.plot_surface(
            r*x + c[0], r*y + c[1], r*z + c[2],
            color='#1f77b4',
            alpha=0.5,
            linewidth=0
            )
    
    plt.show()
    

    1 回复  |  直到 7 年前
        1
  •  4
  •   ImportanceOfBeingErnest    7 年前

    不,没有“球体艺术家”这样的东西。即使有,也不会花更少的时间来绘制它。

    u = numpy.linspace(0, 2*numpy.pi, 12)
    v = numpy.linspace(0, numpy.pi, 7)
    

    not actually been designed for it ; 和使用 Mayavi 相反 上面在mayavi的图片看起来像

    from mayavi import mlab
    import numpy as np
    
    [phi,theta] = np.mgrid[0:2*np.pi:12j,0:np.pi:12j]
    x = np.cos(phi)*np.sin(theta)
    y = np.sin(phi)*np.sin(theta)
    z = np.cos(theta)
    
    def plot_sphere(p):
        r,a,b,c = p
        return mlab.mesh(r*x+a, r*y+b, r*z+c)  
    
    
    for k in range(200):
        c = np.random.rand(4)
        c[0] /= 10.
        plot_sphere(c)
    
    mlab.show()
    

    虽然计算需要相似的时间,但在Mayavi中交互缩放或平移要快得多。

    points3d

    from mayavi import mlab
    import numpy as np
    
    c = np.random.rand(200,3)
    r = np.random.rand(200)/10.
    
    mlab.points3d(c[:,0],c[:,1],c[:,2],r)
    
    mlab.show()
    

    enter image description here