# ParametricObjectsDemo2

VTKExamples/Cxx/Deprecated/GeometricObjects/ParametricObjectsDemo2

Other Languages

See (Python)

Question

### Code¶

ParametricObjectsDemo2.cxx

#include <vtkActor.h>
#include <vtkActor2D.h>
#include <vtkCamera.h>
#include <vtkMath.h>
#include <vtkNamedColors.h>
#include <vtkParametricFunctionSource.h>
#include <vtkPoints.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkTextMapper.h>
#include <vtkTextProperty.h>

#include <vtkParametricBohemianDome.h>
#include <vtkParametricBour.h>
#include <vtkParametricCatalanMinimal.h>
#include <vtkParametricFunction.h>
#include <vtkParametricHenneberg.h>
#include <vtkParametricKuen.h>
#include <vtkParametricPluckerConoid.h>
#include <vtkParametricPseudosphere.h>

#include <array>
#include <vector>

int main(int, char* [])
{
vtkSmartPointer<vtkNamedColors> colors =
vtkSmartPointer<vtkNamedColors>::New();

// Set the background color.
std::array<unsigned char , 4> bkg{{26, 51, 102, 255}};
colors->SetColor("BkgColor", bkg.data());

std::vector<vtkSmartPointer<vtkParametricFunction>> parametricObjects;
parametricObjects.push_back(
vtkSmartPointer<vtkParametricBohemianDome>::New());
static_cast<vtkParametricBohemianDome*>(parametricObjects.back().GetPointer())
->SetA(5.0);
static_cast<vtkParametricBohemianDome*>(parametricObjects.back().GetPointer())
->SetB(1.0);
static_cast<vtkParametricBohemianDome*>(parametricObjects.back().GetPointer())
->SetC(2.0);
parametricObjects.push_back(vtkSmartPointer<vtkParametricBour>::New());
parametricObjects.push_back(
vtkSmartPointer<vtkParametricCatalanMinimal>::New());
parametricObjects.push_back(vtkSmartPointer<vtkParametricHenneberg>::New());
parametricObjects.push_back(vtkSmartPointer<vtkParametricKuen>::New());
parametricObjects.push_back(
vtkSmartPointer<vtkParametricPluckerConoid>::New());
parametricObjects.push_back(
vtkSmartPointer<vtkParametricPseudosphere>::New());

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(12);
textProperty->SetJustificationToCentered();

vtkSmartPointer<vtkProperty> backProperty =
vtkSmartPointer<vtkProperty>::New();
backProperty->SetColor(colors->GetColor3d("Tomato").GetData());

// Create a parametric function source, renderer, mapper, and actor
// for each object
for (auto i = 0; i < parametricObjects.size(); i++)
{
parametricFunctionSources.push_back(
vtkSmartPointer<vtkParametricFunctionSource>::New());
parametricFunctionSources[i]->SetParametricFunction(parametricObjects[i]);
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]->GetProperty()->SetColor(colors->GetColor3d("Banana").GetData());
actors[i]->GetProperty()->SetSpecular(.5);
actors[i]->GetProperty()->SetSpecularPower(20);
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());
renderers[i]->SetBackground(colors->GetColor3d("BkgColor").GetData());
}

// Setup the viewports
auto xGridDimensions = 4;
auto yGridDimensions = 2;
auto rendererSize = 200;
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetWindowName("Parametric Objects Demonstration2");
renderWindow->SetSize(rendererSize * xGridDimensions,
rendererSize * yGridDimensions);

for(auto row = 0; row < yGridDimensions; row++)
{
for(auto col = 0; col < xGridDimensions; col++)
{
int index = row * xGridDimensions + col;

// (xmin, ymin, xmax, ymax)
double viewport[4] = {
static_cast<double>(col) / xGridDimensions,
static_cast<double>(yGridDimensions - (row + 1))/ yGridDimensions,
static_cast<double>(col + 1) / xGridDimensions,
static_cast<double>(yGridDimensions - row) / yGridDimensions
};

if(index > int(actors.size()) - 1)
{
// Add a renderer even if there is no actor.
// This makes the render window background all the same color.
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
ren->SetBackground(colors->GetColor3d("BkgColor").GetData());
ren->SetViewport(viewport);
continue;
}

renderers[index]->SetViewport(viewport);
renderers[index]->ResetCamera();
renderers[index]->GetActiveCamera()->Azimuth(30);
renderers[index]->GetActiveCamera()->Elevation(-30);
renderers[index]->ResetCameraClippingRange();
}
}

vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);

renderWindow->Render();
interactor->Start();

return EXIT_SUCCESS;
}


### CMakeLists.txt¶

cmake_minimum_required(VERSION 3.3 FATAL_ERROR)

project(ParametricObjectsDemo2)

find_package(VTK COMPONENTS
vtkCommonColor
vtkCommonComputationalGeometry
vtkCommonCore
vtkInteractionStyle
vtkRenderingContextOpenGL2
vtkRenderingCore
vtkRenderingFreeType
vtkRenderingGL2PSOpenGL2
vtkRenderingOpenGL2 QUIET)
if (NOT VTK_FOUND)
message("Skipping ParametricObjectsDemo2: ${VTK_NOT_FOUND_MESSAGE}") return () endif() message (STATUS "VTK_VERSION:${VTK_VERSION}")
if (VTK_VERSION VERSION_LESS "8.90.0")
# old system
include(${VTK_USE_FILE}) add_executable(ParametricObjectsDemo2 MACOSX_BUNDLE ParametricObjectsDemo2.cxx ) target_link_libraries(ParametricObjectsDemo2 PRIVATE${VTK_LIBRARIES})
else ()
# include all components
target_link_libraries(ParametricObjectsDemo2 PRIVATE ${VTK_LIBRARIES}) # vtk_module_autoinit is needed vtk_module_autoinit( TARGETS ParametricObjectsDemo2 MODULES${VTK_LIBRARIES}
)
endif ()


cd ParametricObjectsDemo2/build


If VTK is installed:

cmake ..


If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

cmake -DVTK_DIR:PATH=/home/me/vtk_build ..


Build the project:

make


and run it:

./ParametricObjectsDemo2


WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.