Python mayavi:如何在3D空间中的随机位置绘制球体

问题描述

这是用于使用mayavi生成大小随机的球体的代码

我想使球体通过表面或结合线相互连接:

  1. 球体必须位于3D空间中的随机位置
  2. 球体必须具有相同的半径
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
    r=1
    return mlab.mesh(r*x+a,r*y+b,r*z )  


for k in range(8):
    c = np.random.rand(4)
    c[0] /= 10.
    plot_sphere(c)

mlab.show()

解决方法

根据球面方程:

enter image description here

因此,当将参数传递给mlab.mesh时,我们希望为每个球体设置[x_0,y_0,z_0],例如它们位于与轴不同的位置。

问题是np.random.rand(4)生成的数字是随机的,但不是唯一的。

让我们进行修改,以使参数[x_0,z_0]是随机且不同的:

  1. 我们使用sample来获取多维数据集中不同的索引号
  2. 我们使用index_to_3d索引将其转换为(x,y,z)坐标

可以调整半径r,以使球体之间的间隔更大或更小。

3D空间的球体

代码:

import random
from itertools import product

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(x_0,z_0):
    r = 0.5
    return mlab.mesh(r * x + x_0,r * y + y_0,r * z + z_0)

SPHERES_NUMBER = 200

CUBE_SIZE = 10

def index_to_3d(i,SIZE):
    z = i // (SIZE * SIZE)
    i -= (z * SIZE * SIZE)
    y = i // SIZE
    x = i % SIZE
    return x,z

random_tuples = [index_to_3d(i,CUBE_SIZE) for i in random.sample(range(CUBE_SIZE ** 3),SPHERES_NUMBER)]

for k in range(SPHERES_NUMBER):
    x_0,z_0 = random_tuples[k]
    plot_sphere(x_0,z_0)

mlab.show()

输出:

enter image description here

Spheres集群

让我们利用gauss为聚类点创建坐标。

代码:

import random
from itertools import product

from mayavi import mlab
import numpy as np

[phi,r * z + z_0)

SPHERES_NUMBER = 200

def create_cluster(CLUSTER_SIZE):
    means_and_deviations = [(1,1.5),(1,1.5)]
    def generate_point(means_and_deviations):
        return tuple(random.gauss(mean,deviation) for mean,deviation in means_and_deviations)
    cluster_points = set()
    while len(cluster_points) < CLUSTER_SIZE:
        cluster_points.add(generate_point(means_and_deviations))
    return list(cluster_points)

cluster_points = create_cluster(SPHERES_NUMBER)

for k in range(SPHERES_NUMBER):
    x_0,z_0 = cluster_points[k]
    plot_sphere(x_0,z_0)

mlab.show()

输出:

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...