VTKFIG  0.20.20181114
Easy VTK based in situ visualization
void vtkfig::Figure::RTCalcTransform ( )
protected

Calculate transformation to unit cube This shall be applied to all data.

Camera is fixed.

Definition at line 568 of file vtkfigFigure.cxx.

569  {
570  if (!transform_dirty) return;
571  auto data=vtkDataSet::SafeDownCast(data_producer->GetOutputDataObject(0));
572 
573  if ( state.xmin<state.xmax
574  &&state.ymin<state.ymax
575  &&(state.spacedim==2 || state.zmin<state.zmax))
576  {
577  data_bounds[0]=state.xmin;
578  data_bounds[1]=state.xmax;
579  data_bounds[2]=state.ymin;
580  data_bounds[3]=state.ymax;
581  data_bounds[4]=state.zmin;
582  data_bounds[5]=state.zmax;
583  data_center[0]=0.5*(data_bounds[0]+data_bounds[1]);
584  data_center[1]=0.5*(data_bounds[2]+data_bounds[3]);
585  data_center[2]=0.5*(data_bounds[4]+data_bounds[5]);
586  }
587  else if (data)
588  {
589  data->GetBounds(data_bounds);
590  data->GetCenter(data_center);
591  }
592  else
593  {
594  throw std::runtime_error("Specify either view volume or dataset for figure\n");
595  }
596  if (!transform)
597  transform = vtkSmartPointer<vtkTransform>::New();
598  transform->Identity();
599  double xsize=data_bounds[1]-data_bounds[0];
600  double ysize=data_bounds[3]-data_bounds[2];
601  double zsize=data_bounds[5]-data_bounds[4];
602  if (state.spacedim==2) zsize=0;
603  double xysize=std::max(xsize,ysize);
604  double xyzsize=std::max(xysize,zsize);
605 
606  // we don't need this if we prevent vectors from being
607  // transformed
608  //state.quiver_arrowscale_geometry=1.0/xyzsize;
609 
610  // transform everything to [0,1]x[0,1]x[0,1]
611  if (state.keep_aspect)
612  {
613  if (xsize>ysize)
614  transform->Translate(0,0.5*(xsize-ysize)/xyzsize,0);
615  else
616  transform->Translate(0.5*(ysize-xsize)/xyzsize,0,0);
617 
618  transform->Scale(1.0/xyzsize, 1.0/xyzsize,1.0/xyzsize);
619  }
620  else
621  {
622  if (state.aspect>1.0)
623  {
624  transform->Translate(0,0.5-0.5/state.aspect,0);
625  transform->Scale(1.0/xsize, 1.0/(state.aspect*ysize),1);
626  }
627  else
628  {
629  transform->Translate(0.5-0.5*state.aspect,0,0);
630  transform->Scale(state.aspect/xsize, 1.0/ysize,1);
631  }
632  }
633 
634  transform->Translate(-data_bounds[0],-data_bounds[2],-data_bounds[4]);
635 
636  double p0[3]={data_bounds[0],data_bounds[2],data_bounds[4]};
637  double p1[3]={data_bounds[1],data_bounds[3],data_bounds[5]};
638  double tp0[3],tp1[3];
639 
640  transform->TransformPoint(p0,tp0);
641  transform->TransformPoint(p1,tp1);
642  trans_bounds[0]=tp0[0];
643  trans_bounds[1]=tp1[0];
644  trans_bounds[2]=tp0[1];
645  trans_bounds[3]=tp1[1];
646  trans_bounds[4]=tp0[2];
647  trans_bounds[5]=tp1[2];
648 
649  transform->TransformPoint(data_center,trans_center);
650 
651  transform_dirty=false;
652  }
double trans_bounds[6]
Definition: vtkfigFigure.h:532
vtkSmartPointer< vtkTrivialProducer > data_producer
Data producer for grid dataset.
Definition: vtkfigFigure.h:247
vtkSmartPointer< vtkTransform > transform
Definition: vtkfigFigure.h:200
struct vtkfig::Figure::@0 state
figure state
double data_center[3]
Definition: vtkfigFigure.h:530
double trans_center[3]
Definition: vtkfigFigure.h:533
double data_bounds[6]
Definition: vtkfigFigure.h:529