Эллипсоид из вокселей в Python

Мне нужно сделать эллипсоид из вокселей в питоне, но я так и не до конца понял, как определить границы этой фигуры. Я видел несколько примеров, где они используют логические операции для определения вокселей, но я не смог заставить их работать так, как я хочу. Любая помощь будет принята с благодарностью.

Это то, что я пробовал:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# the angles and radius
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
radius = 4

# equations for the shell of the ellipsoid
X = 3*radius*np.sin(v)*np.cos(u)
Y = 2*radius*np.sin(v)*np.sin(u)
Z = radius*np.cos(v)


x, y, z = np.indices((10, 10, 10))
voxels = (x <= X) | (y <= Y) | (z <= Z)
ax.voxels(voxels)

plt.show()

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-f0d9033151c5> in <module>
     14 
     15 x, y, z = np.indices((10, 10, 10))
---> 16 voxels = (x <= X) | (y <= Y) | (z <= Z)
     17 ax.voxels(voxels)
     18 

ValueError: operands could not be broadcast together with shapes (10,10,10) (100,)

person An Hernández    schedule 15.10.2020    source источник


Ответы (1)


Вы можете отфильтровать точки внутри эллипсоида на равномерно распределенной сетке, используя meshgrid, а затем применив к точкам логическую маску:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# grid points in spherical coord:
N = 40
R = 1
x,y,z = np.meshgrid(np.linspace(-R, R, N), np.linspace(-R, R, N),np.linspace(-R, R, N))

# filter points outside ellipsoid interior:
mask = (2*x)**2 + (3*y)**2 + z**2 <= R**2
x = x[mask]
y = y[mask]
z = z[mask]


# convert to cartesian for plotting:

ax.scatter3D(x,y,z)
ax.set_xlim(-1.2,1.2)
ax.set_ylim(-1.2,1.2)
ax.set_zlim(-1.2,1.2)
plt.show()

введите здесь описание изображения

person anon01    schedule 15.10.2020
comment
Если вам нужно нанести много точек (более ~ 500), я бы порекомендовал проверить plotly, так как это будет намного быстрее. Вы можете увидеть пример кода здесь: stackoverflow. ком/вопросы/43187484/ - person anon01; 15.10.2020
comment
Это не совсем то, что мне нужно, мне нужно сделать эллипсоид из вокселей, также с вокселями внутри. - person An Hernández; 15.10.2020
comment
вам нужно это построить или просто хотите определить эти точки? - person anon01; 15.10.2020