2012-02-23 2 views
8

Я хотел бы сделать 3D контур участка, используя MayaVi точно так же, как и третьей фигуры на этой странице (водородную электронной модели облака):3D контур участка из данных с помощью MayaVi/Python

http://www.sethanil.com/python-for-reseach/5

У меня есть набор точек данных, которые я создал, используя мою собственную модель, которую я хотел бы использовать. Точки данных хранятся в многомерном массиве Numpy следующим образом:

XYZV = [[1, 2, 3, 4], 
     [6, 7, 8, 9], 
     ... 
     [4, 5, 6, 7]] 

Точки данных не равномерно распределяется в пространстве XYZ и не хранятся в определенном порядке. Я думаю, что в примере используется meshgrid для создания точек данных - я просмотрел это, но полностью не понимаю его. Любая помощь приветствуется?

H http://www.sethanil.com/_/rsrc/1267943775903/python-for-reseach/5/Article5-fig3.png

+0

Покажите нам, что вы пытались до сих пор. Мы поможем оттуда. –

+0

Просто для справок в будущем, такие вопросы очень подходят для [scicomp.SE]. –

ответ

9

Хитрость заключается в том, чтобы интерполировать над сеткой перед вами сюжет - я бы использовал scipy для этого. Ниже R представляет собой (500,3) массив значений XYZ и V является «величиной» в каждой точке XYZ.

from scipy.interpolate import griddata 
import numpy as np 

# Create some test data, 3D gaussian, 200 points 
dx, pts = 2, 100j 

N = 500 
R = np.random.random((N,3))*2*dx - dx 
V = np.exp(-((R**2).sum(axis=1))) 

# Create the grid to interpolate on 
X,Y,Z = np.mgrid[-dx:dx:pts, -dx:dx:pts, -dx:dx:pts] 

# Interpolate the data 
F = griddata(R, V, (X,Y,Z)) 

Отсюда это несложно, чтобы отобразить наши данные:

from mayavi.mlab import * 
contour3d(F,contours=8,opacity=.2) 

Это дает хороший (кусковой) гауссово.

enter image description here

Взгляните на документы для griddata, обратите внимание, что вы можете изменить метод интерполяции. Если у вас больше очков (как в интерполированной сетке, так и в наборе данных), интерполяция становится лучше и лучше отражает базовую функцию, которую вы пытаетесь проиллюстрировать. Вот пример выше на 10К точек и более мелкая сетка:

enter image description here

+0

Большое спасибо. Отлично работает! Только один вопрос: если бы я хотел удвоить количество очков на фитинговой сетке, что бы я изменил в строке «dx, pts = 2, 100j»? – joshlk

+0

@ Josh вы бы изменили его на 'dx, pts = 2, 200j', однако это удвоило бы количество точек в _each dimension_, поэтому у вас было бы 2^3 = 8-кратное количество точек для интерполяции. 'dx' управляет степенью сетки графика. Для более тонкого контроля просто 'mgrid' для каждого линейного измерения. – Hooked

+0

Я нахожу, что функция griddata может занять очень много времени, чтобы вычислить. Знаете ли вы какие-либо советы по ускорению процесса? – joshlk

4

Вы можете использовать delaunay3d фильтр для создания клеток из точек. Затем вы можете создать iso_surface() для вывода UnstructuredGrid delaunay3d. Если вы хотите ImageData, вы можете использовать фильтр image_data_probe.

import numpy as np 
from tvtk.api import tvtk 
from mayavi import mlab 

points = np.random.normal(0, 1, (1000, 3)) 
ug = tvtk.UnstructuredGrid(points=points) 
ug.point_data.scalars = np.sqrt(np.sum(points**2, axis=1)) 
ug.point_data.scalars.name = "value" 
ds = mlab.pipeline.add_dataset(ug) 
delaunay = mlab.pipeline.delaunay3d(ds) 
iso = mlab.pipeline.iso_surface(delaunay) 
iso.actor.property.opacity = 0.1 
iso.contour.number_of_contours = 10 
mlab.show() 

enter image description here

+0

Привет, когда я использую этот метод с моими собственными данными, я постоянно получаю множество ошибок, появляющихся в новых окнах с последним высказыванием: «Предупреждение: в C: \ pisi \ tmp \ VTK-5.6.0-2 \ work \ VTK \ Graphics \ vtkDelaunay3D.cxx, строка 488 vtkDelaunay3D (03AD2250): обнаружены 27 вырожденных треугольников, подозреваемый в качестве качества сетки ". Вы знаете, что происходит? – joshlk

 Смежные вопросы

  • Нет связанных вопросов^_^