Я пытаюсь построить геометрию, состоящую из сферических поверхностей, в 3D. Есть десятки тысяч этих сфер, с заданными координатами, радиусом и цветом для каждой из них.
Я хочу использовать разброс с трехмерной осью (mpl_toolkits.mplot3d.Axes3D
), потому что я не нашел более эффективного способасделать это в 3D. Я также не могу использовать Mayavi
. Тем не менее, я хотел бы видеть свою геометрию в масштабе, это означает, что шары должны иметь заданный радиус в масштабе XYZ (метры).
После некоторых исследований кажется, что размер, который мне нужно предоставитьscatter
- это поверхность в pt ^ 2, где 1 pt = dpi / 72 пикселя. Мне нужно создать новую функцию scatter2
, где находится поверхность (диска или сферы, я не уверен ...)дается в метрах ^ 2, преобразуйте его в пиксели ^ 2, которые затем преобразуются в pt ^ 2.
Кто-нибудь знает, как заполнить эти метры ^ 2 => пикселей ^ 2?
Кроме того, если у вас есть лучшее (более простое и / или более быстрое в работе) решение, я был бы рад услышать об этом.
Наконец, даже при использовании scatter
сюжет очень медленный, когда я пытаюсьвращать геометрию. Это нормально? Могу ли я добавить что-то в мой код, чтобы ускорить графическую обработку?
Вот мой код на данный момент:
from random import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def scatter2(fig,ax,x,y,z,c,s_meters2):
s_pixels2 = [s_meters2[i]*1 for i in range(len(s_meters2))] # meters^2 => pixels^2,how to do?
s_pt2 = [s_pixels2[i]*fig.dpi/72 for i in range(len(s_pixels2))] # pixels^2 => pt^2
ax.scatter3D(x,y,z,c=c,s=s_pt2)
if __name__ == "__main__":
n_spheres = 50000
x = [random()*100 for i in range(n_spheres)]
y = [random()*100 for i in range(n_spheres)]
z = [random()*100 for i in range(n_spheres)]
s = [random()*1 for i in range(n_spheres)]
c = [[random(),random(),random()] for i in range(n_spheres)]
fig = plt.figure()
ax = plt.subplot(111, projection='3d')
scatter2(fig,ax,x,y,z,c,s)
Пожалуйста, скажите мне также, если это запрограммировано и синтаксисвсе в порядке, я новичок.
Спасибо!