使用VTK的3D等高线图C ++示例?

时间:2012-04-03 10:20:06

标签: c++ vtk

我尝试使用C ++中的VTK库。

是否有任何使用VTK的例子来绘制如下所示的简单3D轮廓图?

official VTK Wiki有几十个代码示例,但我找不到这个简单任务的任何有用示例。

a 3d plot

4 个答案:

答案 0 :(得分:3)

我相信可能适合您的VTK管道的草图如下。如果你创建一些x和y点为vtkPoints,然后将它们移动到StructuredGrid数据类型,然后使用GeometryFilter添加z轴,你应该通过vtkWarpScalar和通常的Mapper和Actor管道生成一个表面。

以下示例代码可以帮助您的vtk构建中的/Examples/DataManipulation/Cxx/SGrid.cxx。如果您有完整的体积和提取的等值面,也可以执行曲面绘图。如果情况并非如此,并且您正在绘制3D功能,那么可能需要填充结构化网格。

答案 1 :(得分:2)

前段时间我想做同样的事情并做了一些广泛的搜索。它没有出现太多,所以我想与你分享我的解决方案。它包含一些多余的代码,但它的工作原理。 http://pastie.org/4721543

我刚刚重新发现了这个问题,因为VTK 6.0将具有plotsurface功能。哪个最有可能比我的代码更高效。我稍后会尝试并更新这篇文章。

对我的代码稍作解释可能会有所帮助。它执行以下操作:

  1. 生成一个二维矩阵大小的平面,用于保存z值(cols& rows代表x和y值)。
  2. 从输入矩阵
  3. 创建xyz-points
  4. 将z值存储为每个点的标量
  5. 根据矩阵的z值扭曲该平面并应用颜色(mapper->SetScalarRange(..)
  6. 绘制你的情节
  7. 它还添加了一个计时器和一个更新命令,它输出渲染统计数据等,正如我所说,你可以省去很多东西。我的blog post详细阐述了这一点,但并不多。

答案 2 :(得分:2)

在Kaikuchn的代码的帮助下,我能够想出一个简单的曲面图。希望这能帮助那些正在寻找类似解决方案的人。

#include "stdafx.h"


#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkDataSetMapper.h>
#include <vtkProperty.h>
#include <vtkCubeAxesActor2D.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkInteractorStyleTrackball.h>
#include <vtkSimplePointsReader.h>
#include <vtkWarpScalar.h>
#include <vtkAxisActor2D.h>


int mains(int, char *[])
{


// Read the file
  vtkSmartPointer<vtkSimplePointsReader> reader =vtkSmartPointer<vtkSimplePointsReader>::New();
  reader->SetFileName ( "simple.xyz" );
  reader->Update();

  vtkSmartPointer<vtkPolyData> inputPolyData = vtkSmartPointer<vtkPolyData>::New();
  inputPolyData ->CopyStructure(reader->GetOutput());


  // warp plane
  vtkSmartPointer<vtkWarpScalar> warp = vtkSmartPointer<vtkWarpScalar>::New();
  warp->SetInput(inputPolyData);
  warp->SetScaleFactor(0.0);

  // Visualize
  vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
  mapper->SetInputConnection(warp->GetOutputPort());



  vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
  actor->GetProperty()->SetPointSize(4);
  actor->SetMapper(mapper);

  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  renderer->AddActor(actor);
  renderer->SetBackground(.3, .6, .3);
  renderWindow->Render();

  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
  renderWindowInteractor->SetInteractorStyle(style);

  // add & render CubeAxes
  vtkSmartPointer<vtkCubeAxesActor2D> axes = vtkSmartPointer<vtkCubeAxesActor2D>::New();
  axes->SetInput(warp->GetOutput());
  axes->SetFontFactor(3.0);
  axes->SetFlyModeToNone();
  axes->SetCamera(renderer->GetActiveCamera());

  vtkSmartPointer<vtkAxisActor2D> xAxis = axes->GetXAxisActor2D();
  xAxis->SetAdjustLabels(1);

  renderer->AddViewProp(axes);
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

simple.xyz;

0.0 0.0 3.0
1.0 4.0 0.0
0.0 1.0 0.0
4.0 0.0 3.0
1.0 4.0 7.0
0.0 6.0 0.0

答案 3 :(得分:0)

在我的系统中,当SetInput()更改为SetInputData()时,代码才会生效。&#39;和&#39; warp&#39;。