使用VTK的C++示例进行3D等高线图绘制?

4
我尝试使用C++中的VTK库。
是否有使用VTK绘制简单的3D轮廓图(如下所示)的示例? 官方VTK Wiki有几十个代码示例,但我找不到任何有用的此简单任务的示例。

a 3d plot


1
请看这里: http://github.enthought.com/mayavi/mayavi/auto/examples.html - Isaiah Norton
1
你找到答案了吗?我也在寻找同样的东西。 - Madz
4个回答

4

在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;
}

简单的.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

xAxis 的使用场景是什么?它看起来没有被使用。 - Gray Programmerz
// 添加和渲染 CubeAxes - Gray Programmerz

3
我认为适合您的VTK管道的大致草图如下。如果您创建了一些x和y点作为vtkPoints,然后将它们移动到StructuredGrid数据类型中,然后使用GeometryFilter添加z轴,应该可以通过经过vtkWarpScalar和通常的Mapper和Actor管道来产生一个表面。
以下示例代码可能会有所帮助/ Examples / DataManipulation / Cxx / SGrid.cxx在您的vtk构建中。如果您有完整的体积并提取了等值面,则还可以执行表面绘制。如果不是这种情况,而您正在绘制3D函数,则可能要填充结构化网格。

2
不久前我想做同样的事情并进行了广泛搜索。 没有找到太多有用的信息,所以我想与您分享我的解决方案。它包含一些不必要的代码,但它有效。http://pastie.org/4721543 我重新发现这个问题是因为VTK 6.0会有一个plotsurface函数。 这很可能比我的代码更加高效。 我会稍后尝试并更新此帖子。
对我的代码做一点说明可能会有所帮助。 它执行以下操作:
1.生成一个大小为2D矩阵的平面,其中保存z值(cols&rows表示x和y值)。 2.从输入矩阵创建xyz点 3.将z值存储为每个点的标量 4.根据矩阵的z值弯曲该平面并应用颜色(mapper->SetScalarRange(..)) 5.绘制你的图表
它还添加了定时器和更新命令,输出渲染统计信息等等。就像我说的,有很多内容可以省略。 我的博客文章详细介绍了一些内容,但不多。

很好的帖子,你忘记在pastie中包含“gauss.h”了,但由于大部分代码对于实际图形来说都是不必要的,所以这并不重要。 - Madz
1
过去的粘贴板已不再可用。 - user6764549
“pasties are forever”但显然pastie.org不是。幸运的是,Madz发布了他的解决方案,该解决方案基于那个pastie中的代码。但这个答案已经超过5年了,我怀疑现在是否有更好的解决方案。 - kaikuchn

0
在我的系统中,当将“SetInput()”更改为“SetInputData()”以用于“axes”和“warp”时,代码可以正常工作。

这是由于VTK 5.0和更高版本之间的差异所致。 - user6764549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接