Mercurial > hg > kwantix
diff src/vtkplot.cpp @ 29:24f3c4ed5c84
Halfway to replacing all namespaces with the kwantxi namespace
author | Jordi GutiƩrrez Hermoso <jordigh@gmail.com> |
---|---|
date | Wed, 03 Feb 2010 18:18:38 -0600 (2010-02-04) |
parents | |
children | 9a2279c9d003 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/vtkplot.cpp @@ -0,0 +1,179 @@ +#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> + +#include <string> +using std::string; + +#include "include/linalg.h" + +typedef double (*Func3d)(double, double); + +void InitOffscreen(bool offscreen); +vtkSmartPointer<vtkDelaunay2D> TriangulateTerrain(Func3d func); + +void PlotPoints(vtkSmartPointer<vtkDelaunay2D> delaunay, + bool offscreen=true, + const string& filename="vtkscreenshot.png"); + +double F(double x, double y) +{ + return atan(x*y*sin(y)); +} + +int main (int argc, char ** argv) +{ + auto delaunay = TriangulateTerrain(&F); + PlotPoints(delaunay,true); + 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, + const string& filename) +{ + 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(filename.c_str()); + 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(); + } +}