2013-05-09 73 views
1

如何从mayavi中的delaunay过滤器提取三角形?提取三角形在mayavi中形成delaunay过滤器

我想提取三角形就像matplotlib确实

import numpy as np 
import matplotlib.delaunay as triang 
from enthought.mayavi import mlab 

x = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) 
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) 
z = np.zeros(9) 
#matplotlib 
centers, edges, triangles_index, neig = triang.delaunay(x,y) 

#mayavi 
vtk_source = mlab.pipeline.scalar_scatter(x, y, z, figure=False) 
delaunay = mlab.pipeline.delaunay2d(vtk_source) 

我想提取从Mayavi的德劳内过滤器的三角形来获得变量@triangle_index和@centers(就像matplotlib)

的只是我发现事情是这样的 http://docs.enthought.com/mayavi/mayavi/auto/example_delaunay_graph.html

,但只获得了边缘,并codificated比matplotlib

不同3210

回答

1

要获得三角形指数:

poly = delaunay.outputs[0] 
tindex = poly.polys.data.to_array().reshape(-1, 4)[:, 1:] 

poly是POLYDATA对象,poly.polys是存储索引信息的CellArray对象。 有关CellArray细节:http://www.vtk.org/doc/nightly/html/classvtkCellArray.html

让每一个外接圆的中心,你需要循环每一个三角形和计算中心:

centers = [] 
for i in xrange(poly.number_of_cells): 
    cell = poly.get_cell(i) 
    points = cell.points.to_array()[:, :-1].tolist() 
    center = [0, 0] 
    points.append(center) 
    cell.circumcircle(*points) 
    centers.append(center) 

centers = np.array(centers) 

cell.circumcircle()是静态函数,所以你需要通过所有的将三角形的点作为参数,中心数据将通过修改第四个参数返回。

下面是完整的代码:

import numpy as np 
from enthought.mayavi import mlab 

x = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) 
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) 
z = np.zeros(9) 

vtk_source = mlab.pipeline.scalar_scatter(x, y, z, figure=False) 
delaunay = mlab.pipeline.delaunay2d(vtk_source) 

poly = delaunay.outputs[0] 
tindex = poly.polys.data.to_array().reshape(-1, 4)[:, 1:] 

centers = [] 
for i in xrange(poly.number_of_cells): 
    cell = poly.get_cell(i) 
    points = cell.points.to_array()[:, :-1].tolist() 
    center = [0, 0] 
    points.append(center) 
    cell.circumcircle(*points) 
    centers.append(center) 

centers = np.array(centers) 

print centers 
print tindex 

输出是:

[[ 1.5 0.5] 
[ 1.5 0.5] 
[ 0.5 1.5] 
[ 0.5 0.5] 
[ 0.5 0.5] 
[ 0.5 1.5] 
[ 1.5 1.5] 
[ 1.5 1.5]] 
[[5 4 2] 
[4 1 2] 
[7 6 4] 
[4 3 1] 
[3 0 1] 
[6 3 4] 
[8 7 4] 
[8 4 5]] 

的结果可能不一样matplotlib.delaunay,因为有许多可能的解决方案。