Difference between revisions of "VTK/Examples/Cxx/GeometricObjects/ParametricObjectsDemo"

From KitwarePublic
< VTK‎ | Examples‎ | Cxx
Jump to: navigation, search
(Replaced content with "= '''See [https://lorensen.github.io/VTKExamples/site/Cxx/GeometricObjects/ParametricObjectsDemo ParametricObjectsDemo] on the new [https://lorensen.github.io/VTKExamples/...")
 
Line 1: Line 1:
==Description==
+
= '''See [https://lorensen.github.io/VTKExamples/site/Cxx/GeometricObjects/ParametricObjectsDemo ParametricObjectsDemo] on the new [https://lorensen.github.io/VTKExamples/site/ VTKExamples website].''' =
See [http://www.vtk.org/img/ParametricSurfaces.pdf Parametric Equations for Surfaces] by Andrew Maclean for an excellent description of these beautiful parametric surfaces.
 
 
 
This example also demonstrates how to manipulate lists of VTK objects using vectors. Notice how parameters of the various Parametric Objects are accessed and set in the parametricObjects vector.
 
 
 
<div class="floatcenter">[[File:VTK_Examples_Baseline_GeometricObjects_TestParametricObjectsDemo.png]]</div>
 
==ParametricObjectsDemo.cxx==
 
<source lang="cpp">
 
#include <vtkSmartPointer.h>
 
#include <vtkCamera.h>
 
#include <vtkPolyDataMapper.h>
 
#include <vtkTextMapper.h>
 
#include <vtkActor.h>
 
#include <vtkActor2D.h>
 
#include <vtkProperty.h>
 
#include <vtkTextProperty.h>
 
#include <vtkRenderWindow.h>
 
#include <vtkRenderer.h>
 
#include <vtkRenderWindowInteractor.h>
 
#include <vtkParametricFunctionSource.h>
 
#include <vtkMath.h>
 
#include <vtkPoints.h>
 
 
 
#include <vtkParametricTorus.h>
 
#include <vtkParametricBoy.h>
 
#include <vtkParametricConicSpiral.h>
 
#include <vtkParametricCrossCap.h>
 
#include <vtkParametricDini.h>
 
#include <vtkParametricEllipsoid.h>
 
#include <vtkParametricEnneper.h>
 
#include <vtkParametricFigure8Klein.h>
 
#include <vtkParametricKlein.h>
 
#include <vtkParametricMobius.h>
 
#include <vtkParametricRandomHills.h>
 
#include <vtkParametricRoman.h>
 
#include <vtkParametricSpline.h>
 
#include <vtkParametricSuperEllipsoid.h>
 
#include <vtkParametricSuperToroid.h>
 
#include <vtkParametricTorus.h>
 
 
 
#include <vector>
 
 
 
int main(int, char *[])
 
{
 
  // Select one of the following (matching the selection above)
 
  std::vector<vtkSmartPointer<vtkParametricFunction> > parametricObjects;
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricBoy>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricConicSpiral>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricCrossCap>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricDini>::New());
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricEllipsoid>::New());
 
  static_cast<vtkParametricEllipsoid *>(
 
    parametricObjects.back().GetPointer())->SetXRadius(.5);
 
  static_cast<vtkParametricEllipsoid *>(
 
    parametricObjects.back().GetPointer())->SetYRadius(2.0);
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricEnneper>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricFigure8Klein>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricKlein>::New());
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricMobius>::New());
 
  static_cast<vtkParametricMobius *>(
 
    parametricObjects.back().GetPointer())->SetRadius(2.0);
 
  static_cast<vtkParametricMobius *>(
 
    parametricObjects.back().GetPointer())->SetMinimumV(-0.5);
 
  static_cast<vtkParametricMobius *>(
 
    parametricObjects.back().GetPointer())->SetMaximumV(0.5);
 
 
 
  vtkSmartPointer<vtkParametricRandomHills> randomHills =
 
    vtkSmartPointer<vtkParametricRandomHills>::New();
 
  randomHills->AllowRandomGenerationOff();
 
  parametricObjects.push_back(randomHills);
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricRoman>::New());
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricSuperEllipsoid>::New());
 
  static_cast<vtkParametricSuperEllipsoid *>(
 
    parametricObjects.back().GetPointer())->SetN1(.50);
 
  static_cast<vtkParametricSuperEllipsoid *>(
 
    parametricObjects.back().GetPointer())->SetN2(.1);
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricSuperToroid>::New());
 
  static_cast<vtkParametricSuperToroid *>(
 
    parametricObjects.back().GetPointer())->SetN1(.2);
 
  static_cast<vtkParametricSuperToroid *>(
 
    parametricObjects.back().GetPointer())->SetN2(3.0);
 
 
 
  parametricObjects.push_back(
 
    vtkSmartPointer<vtkParametricTorus>::New());
 
 
 
  // The spline needs points
 
  vtkSmartPointer<vtkParametricSpline> spline =
 
    vtkSmartPointer<vtkParametricSpline>::New();
 
  vtkSmartPointer<vtkPoints> inputPoints =
 
    vtkSmartPointer<vtkPoints>::New();
 
  vtkMath::RandomSeed(8775070);
 
  for (int p = 0; p < 10; p++)
 
    {
 
    double x = vtkMath::Random(0.0, 1.0);
 
    double y = vtkMath::Random(0.0, 1.0);
 
    double z = vtkMath::Random(0.0, 1.0);
 
    inputPoints->InsertNextPoint(x, y, z);
 
    }
 
  spline->SetPoints(inputPoints);
 
  parametricObjects.push_back(spline);
 
 
 
  std::vector<vtkSmartPointer<vtkParametricFunctionSource> >
 
    parametricFunctionSources;
 
  std::vector<vtkSmartPointer<vtkRenderer> >
 
    renderers;
 
  std::vector<vtkSmartPointer<vtkPolyDataMapper> >
 
    mappers;
 
  std::vector<vtkSmartPointer<vtkActor> >
 
    actors;
 
  std::vector<vtkSmartPointer<vtkTextMapper> >
 
    textmappers;
 
  std::vector<vtkSmartPointer<vtkActor2D> >
 
    textactors;
 
 
 
  // Create one text property for all
 
  vtkSmartPointer<vtkTextProperty> textProperty =
 
    vtkSmartPointer<vtkTextProperty>::New();
 
  textProperty->SetFontSize(10);
 
  textProperty->SetJustificationToCentered();
 
 
 
  vtkSmartPointer<vtkProperty> backProperty =
 
    vtkSmartPointer<vtkProperty>::New();
 
  backProperty->SetColor(1.0, 0.0, 0.0);
 
 
 
  // Create a parametric function source, renderer, mapper, and actor
 
  // for each object
 
  for(unsigned int i = 0; i < parametricObjects.size(); i++)
 
    {
 
    parametricFunctionSources.push_back(
 
      vtkSmartPointer<vtkParametricFunctionSource>::New());
 
    parametricFunctionSources[i]->SetParametricFunction(parametricObjects[i]);
 
    parametricFunctionSources[i]->SetUResolution(51);
 
    parametricFunctionSources[i]->SetVResolution(51);
 
    parametricFunctionSources[i]->SetWResolution(51);
 
    parametricFunctionSources[i]->Update();
 
 
 
    mappers.push_back(vtkSmartPointer<vtkPolyDataMapper>::New());
 
    mappers[i]->SetInputConnection(
 
      parametricFunctionSources[i]->GetOutputPort());
 
 
 
    actors.push_back(vtkSmartPointer<vtkActor>::New());
 
    actors[i]->SetMapper(mappers[i]);
 
    actors[i]->SetBackfaceProperty(backProperty);
 
 
 
    textmappers.push_back(vtkSmartPointer<vtkTextMapper>::New());
 
    textmappers[i]->SetInput(parametricObjects[i]->GetClassName());
 
    textmappers[i]->SetTextProperty(textProperty);
 
 
 
    textactors.push_back(vtkSmartPointer<vtkActor2D>::New());
 
    textactors[i]->SetMapper(textmappers[i]);
 
    textactors[i]->SetPosition(100, 16);
 
    renderers.push_back(vtkSmartPointer<vtkRenderer>::New());
 
    }
 
  unsigned int gridDimensions = 4;
 
 
 
  // Need a renderer even if there is no actor
 
  for(size_t i = parametricObjects.size();
 
      i < gridDimensions * gridDimensions;
 
      i++)
 
    {
 
    renderers.push_back(vtkSmartPointer<vtkRenderer>::New());
 
    }
 
 
 
  vtkSmartPointer<vtkRenderWindow> renderWindow =
 
    vtkSmartPointer<vtkRenderWindow>::New();
 
  int rendererSize = 200;
 
  renderWindow->SetSize(
 
    rendererSize*gridDimensions, rendererSize*gridDimensions);
 
 
 
  for(int row = 0; row < static_cast<int>(gridDimensions); row++)
 
    {
 
    for(int col = 0; col < static_cast<int>(gridDimensions); col++)
 
      {
 
      int index = row*gridDimensions + col;
 
 
 
      // (xmin, ymin, xmax, ymax)
 
      double viewport[4] =
 
        {static_cast<double>(col) * rendererSize / (gridDimensions * rendererSize),
 
        static_cast<double>(gridDimensions - (row+1)) * rendererSize / (gridDimensions * rendererSize),
 
        static_cast<double>(col+1)*rendererSize / (gridDimensions * rendererSize),
 
        static_cast<double>(gridDimensions - row) * rendererSize / (gridDimensions * rendererSize)};
 
 
 
      renderWindow->AddRenderer(renderers[index]);
 
      renderers[index]->SetViewport(viewport);
 
      if(index > static_cast<int>(parametricObjects.size() - 1))
 
        {
 
        continue;
 
        }
 
      renderers[index]->AddActor(actors[index]);
 
      renderers[index]->AddActor(textactors[index]);
 
      renderers[index]->SetBackground(.2, .3, .4);
 
      renderers[index]->ResetCamera();
 
      renderers[index]->GetActiveCamera()->Azimuth(30);
 
      renderers[index]->GetActiveCamera()->Elevation(-30);
 
      renderers[index]->GetActiveCamera()->Zoom(0.9);
 
      renderers[index]->ResetCameraClippingRange();
 
      }
 
    }
 
 
 
  vtkSmartPointer<vtkRenderWindowInteractor> interactor =
 
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
 
  interactor->SetRenderWindow(renderWindow);
 
 
 
  renderWindow->Render();
 
  interactor->Start();
 
 
 
  return EXIT_SUCCESS;
 
}
 
</source>
 
 
 
{{VTKCMakeLists|{{SUBPAGENAME}}}}
 

Latest revision as of 17:35, 31 March 2019

See ParametricObjectsDemo on the new VTKExamples website.