直接使用vtkPlaneSource, vtkRegularPolygonSource等现成的类好像无法画出此类网格平面,这样就只能自己构造polydata了。
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
int main(int argc, char* argv[])
{
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
double rangeX[2] = { -1.0, 1.0 };
double rangeY[2] = { -1.0, 1.0 };
double intervalX = 0.02, intervalY = 0.05;
// Y lines
for (double gridX = rangeX[0]; gridX < rangeX[1] + (intervalX / 2.0); gridX += intervalX)
{
double lineStart[3] = { gridX, rangeY[0], 0.0 };
double lineEnd[3] = { gridX, rangeY[1], 0.0 };
vtkIdType pointIdStart = points->InsertNextPoint(lineStart);
vtkIdType pointIdEnd = points->InsertNextPoint(lineEnd);
vtkIdType singleLineCell[2] = { pointIdStart, pointIdEnd };
cells->InsertNextCell(2, singleLineCell);
}
// x lines
for (double gridY = rangeY[0]; gridY < rangeY[1] + (intervalY / 2.0); gridY += intervalY)
{
double lineStart[3] = { rangeX[0], gridY, 0.0 };
double lineEnd[3] = { rangeX[1], gridY, 0.0 };
vtkIdType pointIdStart = points->InsertNextPoint(lineStart);
vtkIdType pointIdEnd = points->InsertNextPoint(lineEnd);
vtkIdType singleLineCell[2] = { pointIdStart, pointIdEnd };
cells->InsertNextCell(2, singleLineCell);
}
polydata->SetLines(cells);
polydata->SetPoints(points);
mapper->SetInputData(polydata);
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// Renderer
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->AddActor(actor);
ren1->SetBackground(0.1, 0.2, 0.4);
// RenderWindow
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(ren1);
renWin->SetSize(300, 300);
// RenderWindowInteractor
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor> ::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
renWin->SetSize(600, 600);
renWin->Render();
iren->Start();
return 0;
}