问题描述
我想使球体通过表面或结合线相互连接:
- 球体必须位于3D空间中的随机位置
- 球体必须具有相同的半径
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()
解决方法
根据球面方程:
因此,当将参数传递给mlab.mesh
时,我们希望为每个球体设置[x_0,y_0,z_0]
,例如它们位于与轴不同的位置。
问题是np.random.rand(4)
生成的数字是随机的,但不是唯一的。
让我们进行修改,以使参数[x_0,z_0]
是随机且不同的:
- 我们使用
sample
来获取多维数据集中不同的索引号 - 我们使用
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()
输出:
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()
输出: