VTKFIG  0.20.20181114
Easy VTK based in situ visualization
example-custom1.cxx
Go to the documentation of this file.
1 
7 #include <chrono>
8 #include "vtkStructuredGrid.h"
9 #include "vtkPointData.h"
10 #include "vtkFloatArray.h"
11 #include "vtkActor.h"
12 #include "vtkOutlineFilter.h"
13 #include "vtkStructuredGridGeometryFilter.h"
14 #include "vtkRenderWindow.h"
15 #include "vtkRenderer.h"
16 #include "vtkRenderWindowInteractor.h"
17 #include "vtkCommand.h"
18 
19 #include "vtkfigFrame.h"
20 #include "vtkfigFigure.h"
21 #include "vtkfigTools.h"
22 
23 inline double G(double x,double y, double t)
24 {
25 
26  return exp(-(x*x+y*y))*sin(t+x)*cos(y-t);
27 }
28 
29 
30  class TimerCallback : public vtkCommand
31  {
32  public:
33 
34 
35  vtkSmartPointer<vtkRenderWindowInteractor> interactor=0;
36 
37  static TimerCallback *New() {return new TimerCallback;}
38 
39  virtual void Execute(
40  vtkObject *vtkNotUsed(caller),
41  unsigned long eventId,
42  void *vtkNotUsed(callData)
43  )
44  {
45 
46 // cout << "t" << endl;
47  interactor->TerminateApp();
48  }
49  };
50 
51 int main(void)
52 {
53 
54  cout <<
55 R"(
56 Example showing creation of custom scenes using
57 vtkfigFrame and vtkfigFigure base class.
58 )";
59 
60  size_t nspin=vtkfig::NSpin();
61 
62  cout.sync_with_stdio(true);
63 
64  const int Nx = 200;
65  const int Ny = 250;
66 
67  std::vector<double> x(Nx);
68  std::vector<double> y(Ny);
69  std::vector<double> z(Nx*Ny);
70 
71  const double x_low = -2.5;
72  const double x_upp = 1.5;
73  const double y_low = -2.5;
74  const double y_upp = 4;
75  const double dx = (x_upp-x_low)/(Nx-1);
76  const double dy = (y_upp-y_low)/(Ny-1);
77 
78 // auto frame=vtkfig::Frame::New();
79 
80 
81 
82 
83 
84  for (int i=0; i<Nx; i++)
85  x[i] = x_low+i*dx;
86 
87  for (int i=0; i<Ny; i++)
88  y[i] = y_low + i*dy;
89 
90 
91  double t=0;
92  double dt=0.1;
93  size_t ii=0;
94  auto t0=std::chrono::system_clock::now();
95  double i0=ii;
96 
97  auto figure=vtkfig::Figure::New();
98 
99  int i,j,k;
100 
101 
102 
103  auto gridfunc=vtkSmartPointer<vtkStructuredGrid>::New();
104  auto points=vtkSmartPointer<vtkPoints>::New();
105  auto colors=vtkSmartPointer<vtkFloatArray>::New();
106 
107  gridfunc->SetDimensions(Nx, Ny, 1);
108 
109  points = vtkSmartPointer<vtkPoints>::New();
110  for (j = 0; j < Ny; j++)
111  {
112  for (i = 0; i < Nx; i++)
113  {
114  points->InsertNextPoint(x[i], y[j], 0);
115  }
116  }
117  gridfunc->SetPoints(points);
118 
119  colors = vtkSmartPointer<vtkFloatArray>::New();
120  colors->SetNumberOfComponents(1);
121  colors->SetNumberOfTuples(Nx*Ny);
122  k = 0;
123  for (j = 0; j < Ny; j++)
124  for (i = 0; i < Nx; i++)
125  {
126  colors->InsertComponent(k, 0, 0);
127  k++;
128  }
129 
130  auto rgbcolors=vtkfig::RGBTable
131  {
132  {0.0, 0.0, 0.0, 1.0},
133  {0.5, 0.0, 1.0, 0.0},
134  {1.0, 1.0, 0.0, 0.0}
135  };
136 
137  vtkSmartPointer<vtkLookupTable> lut = vtkfig::BuildLookupTable(rgbcolors,255);
138 
139  gridfunc->GetPointData()->SetScalars(colors);
140 
141 
142  // filter to geometry primitive
143  auto geometry = vtkSmartPointer<vtkStructuredGridGeometryFilter>::New();
144  geometry->SetInputDataObject(gridfunc);
145 
146 
147  // map gridfunction
148  auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
149  mapper->SetInputConnection(geometry->GetOutputPort());
150 
151 
152  // create plot surface actor
153  auto surfplot = vtkSmartPointer<vtkActor>::New();
154  surfplot->SetMapper(mapper);
155  mapper->SetLookupTable(lut);
156  mapper->UseLookupTableScalarRangeOn();
157 
158 
159  // create outline
160  auto outlinefilter = vtkSmartPointer<vtkOutlineFilter>::New();
161  outlinefilter->SetInputConnection(geometry->GetOutputPort());
162 
163  auto outlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
164  outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());
165  auto outline = vtkSmartPointer<vtkActor>::New();
166  outline->SetMapper(outlineMapper);
167  outline->GetProperty()->SetColor(0, 0, 0);
168 
169 
170  auto window=vtkSmartPointer<vtkRenderWindow>::New();
171  auto renderer=vtkSmartPointer<vtkRenderer>::New();
172  window->AddRenderer(renderer);
173  auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
174  interactor->SetRenderWindow(window);
175  renderer->AddActor(surfplot);
176  renderer->AddActor(outline);
177  renderer->AddActor2D(vtkfig::BuildColorBar(mapper));
178 
179 
180  auto callback = vtkSmartPointer<TimerCallback>::New();
181  callback->interactor=interactor;
182  interactor->AddObserver(vtkCommand::TimerEvent,callback);
183 
184 
185  interactor->Initialize();
186  interactor->CreateRepeatingTimer(10);
187 
188 
189 
190 
191 
192  while (ii <nspin)
193  {
194 
195  for (int i=0; i<Nx; i++)
196  for (int j=0; j<Ny; j++)
197  z[j*Nx+i] = G(x[i],y[j],t);
198 
199  float vmax=-10000;
200  float vmin=10000;
201  for (int j = 0; j < Ny; j++)
202  {
203  for (int i = 0; i < Nx; i++)
204  {
205  int k=j*Nx+i;
206  float v=z[k];
207  vmin=std::min(v,vmin);
208  vmax=std::max(v,vmax);
209  double p[3];
210  points->GetPoint(k,p);
211  p[2]=v;
212  points->SetPoint(k,p);
213  colors->InsertComponent(k, 0,v);
214  }
215  }
216 
217  points->Modified();
218  colors->Modified();
219  gridfunc->Modified();
220 
221  lut->SetTableRange(vmin,vmax);
222  lut->Modified();
223  renderer->SetBackground(1,1,1);
224  interactor->Render();
225  interactor->Start();
226 
227  t+=dt;
228  auto t1=std::chrono::system_clock::now();
229  double dt=std::chrono::duration_cast<std::chrono::duration<double>>(t1-t0).count();
230  double i1=ii;
231  if (dt>4.0)
232  {
233  printf("Frame rate: %.2f fps\n",(double)(i1-i0)/4.0);
234  t0=std::chrono::system_clock::now();
235  i0=ii;
236  fflush(stdout);
237  }
238  ii++;
239  }
240 
241 }
size_t NSpin()
Definition: vtkfigTools.cxx:13
double G(double x, double y, double t)
vtkSmartPointer< vtkRenderWindowInteractor > interactor
vtkSmartPointer< vtkLookupTable > BuildLookupTable(RGBTable &xrgb, size_t size)
static std::shared_ptr< Figure > New()
Construct smartpointer to empty figure.
Definition: vtkfigFigure.h:61
int main(void)
std::vector< RGBPoint > RGBTable
Definition: vtkfigTools.h:26
virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId, void *vtkNotUsed(callData))
vtkSmartPointer< vtkScalarBarActor > BuildColorBar(vtkSmartPointer< vtkPolyDataMapper > mapper, int irank=0)
Definition: vtkfigTools.cxx:88
static TimerCallback * New()
Define Frame class providing a window for rendering.