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

2024-10-02 20:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个用mayavi生成随机大小球体的代码

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

  1. 球体必须位于三维空间中的任意位置
  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()

Tags: 代码importplotnppisincos表面
1条回答
网友
1楼 · 发布于 2024-10-02 20:35:10

从球体方程:

enter image description here

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

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

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

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

半径r可以调整为球体之间有更多或更少的间距

三维空间中的球体

代码:

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, y_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, y, 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, y_0, z_0 = random_tuples[k]
    plot_sphere(x_0, y_0, z_0)

mlab.show()

输出:

enter image description here

球体簇

让我们利用^{}为簇点创建坐标

代码:

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

SPHERES_NUMBER = 200

def create_cluster(CLUSTER_SIZE):
    means_and_deviations = [(1, 1.5), (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, y_0, z_0 = cluster_points[k]
    plot_sphere(x_0, y_0, z_0)

mlab.show()

输出:

enter image description here

相关问题 更多 >