У меня есть набор трехмерных точек. Эти точки отбираются на постоянных уровнях (z = 0,1,..., 7). Изображение должно прояснить:
Эти точки находятся в numpy ndarray формы (N, 3)
, называемой X
. Вышеприведенный график создается с использованием:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X = load('points.npy')
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_wireframe(X[:,0], X[:,1], X[:,2])
ax.scatter(X[:,0], X[:,1], X[:,2])
plt.draw()
Я хотел бы вместо этого триангулировать только поверхность этого объекта и нарисовать поверхность. Я не хочу, чтобы выпуклая оболочка этого объекта, тем не менее, потому что это теряет тонкую информацию о форме, которую я хотел бы проверить.
Я пробовал ax.plot_trisurf(X[:,0], X[:,1], X[:,2])
, но это приводит к следующему беспорядку:
Любая помощь?
Примеры данных
Здесь приведен фрагмент для создания трехмерных данных, которые являются репрезентативными для проблемы:
import numpy as np
X = []
for i in range(8):
t = np.linspace(0,2*np.pi,np.random.randint(30,50))
for j in range(t.shape[0]):
# random circular objects...
X.append([
(-0.05*(i-3.5)**2+1)*np.cos(t[j])+0.1*np.random.rand()-0.05,
(-0.05*(i-3.5)**2+1)*np.sin(t[j])+0.1*np.random.rand()-0.05,
i
])
X = np.array(X)
Пример данных из исходного изображения
Здесь пастебин к исходным данным:
Вот срезы вдоль постоянной z: