Mercurial > hg > kwantix
view vtk/terrain_test.cpp @ 25:6c6003bcad16
Cleanup, work on VTK code
author | Jordi Gutiérrez Hermoso <jordigh@gmail.com> |
---|---|
date | Mon, 01 Feb 2010 17:42:16 -0600 (2010-02-01) |
parents | ad9e3d28ce9b |
children | 093a9e7e26df |
line wrap: on
line source
#include <vtkPoints.h> #include <vtkPointData.h> #include <vtkDelaunay2D.h> #include <vtkLookupTable.h> #include <vtkPolyData.h> #include <vtkPolyDataNormals.h> #include <vtkPolyDataMapper.h> #include <vtkWarpScalar.h> #include <vtkCamera.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkInteractorStyleTerrain.h> #include <vtkSmartPointer.h> #include <vtkDoubleArray.h> #include <vtkGraphicsFactory.h> #include <vtkImagingFactory.h> #include <vtkWindowToImageFilter.h> #include <vtkPNGWriter.h> typedef double (*Func3d)(double, double); void InitOffscreen(bool offscreen); vtkSmartPointer<vtkDelaunay2D> TriangulateTerrain(Func3d func); void PlotPoints(vtkSmartPointer<vtkDelaunay2D> delaunay, bool offscreen=true); double F(double x, double y) { return atan(x*y*y); } int main (int argc, char ** argv) { auto delaunay = TriangulateTerrain(&F); PlotPoints(delaunay,false); return 0; } void InitOffscreen(bool offscreen) { // Graphics Factory vtkSmartPointer<vtkGraphicsFactory> graphics_factory = vtkGraphicsFactory::New(); graphics_factory->SetOffScreenOnlyMode( offscreen ); graphics_factory->SetUseMesaClasses( offscreen ); // Imaging Factory vtkSmartPointer<vtkImagingFactory> imaging_factory = vtkImagingFactory::New(); imaging_factory->SetUseMesaClasses( offscreen ); } vtkSmartPointer<vtkDelaunay2D> TriangulateTerrain(Func3d func) { vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); vtkSmartPointer<vtkDoubleArray> scalars = vtkSmartPointer<vtkDoubleArray>::New(); unsigned int GridSize = 50; for(double x = -3; x < 3; x += 6.0/GridSize) { for(double y = -3; y < 3; y += 6.0/GridSize) { double z = func(x,y); vtkIdType idx = points->InsertNextPoint(x, y, z); scalars -> InsertTuple(idx, &z); } } //add the grid points to a polydata object vtkSmartPointer<vtkPolyData> polydata = vtkPolyData::New(); polydata->SetPoints(points); polydata->GetPointData() -> SetScalars(scalars); //triangulate the grid points vtkSmartPointer<vtkDelaunay2D> delaunay = vtkDelaunay2D::New(); delaunay->SetInput(polydata); delaunay->Update(); return delaunay; } void PlotPoints(vtkSmartPointer<vtkDelaunay2D> delaunay, bool offscreen) { InitOffscreen(offscreen); //Normals for Gourad shading vtkSmartPointer<vtkPolyDataNormals> normals = vtkPolyDataNormals::New(); normals -> SetInputConnection(delaunay ->GetOutputPort() ); normals -> SetFeatureAngle(60); //Set the colours for the rendering vtkSmartPointer<vtkLookupTable> lut = vtkLookupTable::New(); lut -> SetHueRange(0.66667, 0.0); lut -> SetNumberOfColors(256); lut -> SetRampToLinear(); lut -> Build(); // map the contours to graphical primitives vtkSmartPointer<vtkPolyDataMapper> contMapper = vtkPolyDataMapper::New(); contMapper->SetInput(normals -> GetOutput() ); contMapper->SetScalarRange(0,1); contMapper->SetLookupTable(lut); contMapper->ImmediateModeRenderingOn(); // create an actor for the contours vtkSmartPointer<vtkActor> contActor = vtkActor::New(); contActor->SetMapper(contMapper); // a renderer and render window vtkSmartPointer<vtkRenderer> ren1 = vtkRenderer::New(); vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New(); if(offscreen) { renWin->SetOffScreenRendering(1); } renWin->AddRenderer(ren1); // an interactor vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); // add the actors to the scene ren1->SetBackground(0.0,0.0,0.0); ren1->GetActiveCamera()->SetViewUp(0,0,1); ren1->GetActiveCamera()->SetPosition(1, -1, -1); ren1->GetActiveCamera()->SetParallelProjection(1); ren1->AddActor(contActor); ren1->ResetCamera(); // render an image (lights and cameras are created automatically) renWin->Render(); if(offscreen) { // Write to file vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = vtkSmartPointer<vtkWindowToImageFilter>::New(); windowToImageFilter->SetInput(renWin); windowToImageFilter->Update(); vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New(); writer->SetFileName("screenshot.png"); writer->SetInput(windowToImageFilter->GetOutput()); writer->Write(); } else { //The style vtkSmartPointer<vtkInteractorStyleTerrain> terrain_style = vtkInteractorStyleTerrain::New(); // Set the style iren -> SetInteractorStyle(terrain_style); // begin mouse interaction iren->Start(); } }