曲面数据文件的生成
程序员文章站
2022-04-01 08:45:17
...
生成vtkSurfaceReconstructionFilter 曲面数据
数组生成vtk可以调用的曲面数据
曲面数据文件的生成
在搜索生成VTK曲面时总是会看到很多代码上来就贴出一段不知道怎么生成的点数组,或者就是直接读一个保存很多点的文件,很是不解。实际使用时我们可能最先得到的就是一个有不同标量值的数组。
假设现在有一个N*M的二维数组DataArray,现在我们来生成这样的一个点集,并保存成 本地文件:
vtkPolyData plydata = vtkPolyData.New();
vtkPoints pts = vtkPoints.New();
for (int y = 0; y < N; y++)
{
for (int x = 0; x < M; x++)
{
pts.InsertNextPoint(x, y, DataArray[y * M+ x]);
}
}
plydata.SetPoints(pts);
vtkSurfaceReconstructionFilter filter = vtkSurfaceReconstructionFilter.New();
//filter 在实例化时默认的NeighborhoodSize为20,对于大多数应用程序,默认值20是够用的,
//如果点的分布不均匀,可以指定更高的值。对某些曲面10就可以产生足够的效果。
//该值越大,算法所需时间越长。
filter.SetNeighborhoodSize(10);
filter.SetInput(plydata);
filter.Update();
vtkContourFilter contour = vtkContourFilter.New();
contour.SetInput(filter.GetOutput());
contour.Update();
//vtkPolyDataMapper pointMapper=vtkPolyDataMapper.New();
//pointMapper.SetInput(contour.GetOutput());
//vtkActor actor=vtkActor.New();
//actor.SetMapper(pointMapper);
vtkPolyDataWriter writer = vtkPolyDataWriter.New();
writer.SetFileName("polydata.vtp");
writer.SetInput(contour.GetOutput());
writer.Write();
之后我们就可以读取这个文件并快速渲染出来
vtkPolyDataReader reader = vtkPolyDataReader.New();
reader.SetFileName("polydata.vtp");
reader.Update();
//此处无需再次调用vtkSurfaceReconstructionFilter
vtkPolyDataMapper pointMapper=vtkPolyDataMapper.New();
pointMapper.SetInput(reader.GetOutput());
vtkActor actor=vtkActor.New();
actor.SetMapper(pointMapper);
由于vtkSurfaceReconstructionFilter 在执行时很耗时,一直没有找到好办法去优化,尝试在生成vtkPolyData时指定其单元属性,并没有达到预期效果。目前把上一段代码放在后台线程中执行,后一段代码放在UI线程中,以实现快速渲染