[vtkusers] Problem with "Compute Gaussian, Mean, Minm and Max Curvatures" example
Sky77
Joan.Hensen at outlook.de
Tue Aug 26 05:42:22 EDT 2014
Hey HTH.
You're right. The sphere alone is an unsuitable example to show that
something isn't working when we are looking at the curvature. Therefore I
have adapted the code. Now we are looking at the Gaussian curvature of two
overlapping spheres. It is clear that the viusalization should show positive
curvature everywhere execpt the area where they overlap. There it should be
negative curvature. My resulting visualization has not changed (see here
<http://vtk.1045678.n5.nabble.com/file/n5728392/result.png> ).
#include <vtkSmartPointer.h>
#include <vtkCurvatures.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkLookupTable.h>
#include <vtkColorTransferFunction.h>
#include <vtkColorSeries.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkScalarBarActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSphereSource.h>
#include <vtkVersion.h>
#include <vtkPolyData.h>
#include <vtkCleanPolyData.h>
#include <vtkAppendPolyData.h>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkPolyData> input1 =
vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyData> input2 =
vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkSphereSource> sphereSource1 =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource1->SetRadius(5);
sphereSource1->SetCenter(-2,0,0);
sphereSource1->SetPhiResolution(15);
sphereSource1->SetThetaResolution(15);
sphereSource1->Update();
input1->ShallowCopy(sphereSource1->GetOutput());
vtkSmartPointer<vtkSphereSource> sphereSource2 =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource2->SetRadius(5);
sphereSource2->SetCenter(2,0,0);
sphereSource2->SetPhiResolution(15);
sphereSource2->SetThetaResolution(15);
sphereSource2->Update();
input2->ShallowCopy(sphereSource2->GetOutput());
//Append the two meshes
vtkSmartPointer<vtkAppendPolyData> appendFilter =
vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputConnection(input1->GetProducerPort());
appendFilter->AddInputConnection(input2->GetProducerPort());
appendFilter->Update();
// Remove any duplicate points.
vtkSmartPointer<vtkCleanPolyData> cleanFilter =
vtkSmartPointer<vtkCleanPolyData>::New();
cleanFilter->SetInputConnection(appendFilter->GetOutputPort());
cleanFilter->Update();
vtkSmartPointer<vtkCurvatures> curvaturesFilter =
vtkSmartPointer<vtkCurvatures>::New();
curvaturesFilter->SetInputConnection(cleanFilter->GetOutputPort());
curvaturesFilter->SetCurvatureTypeToGaussian();
curvaturesFilter->Update();
// Get scalar range from command line if present, otherwise use
// range of computed curvature
double scalarRange[2];
if (argc >= 4)
{
scalarRange[0] = atof(argv[2]);
scalarRange[1] = atof(argv[3]);
}
else
{
curvaturesFilter->GetOutput()->GetScalarRange(scalarRange);
}
int scheme = 16;
if (argc >= 5)
{
scheme = atoi(argv[4]);
}
// Build a lookup table
vtkSmartPointer<vtkColorSeries> colorSeries =
vtkSmartPointer<vtkColorSeries>::New();
colorSeries->SetColorScheme(scheme);
vtkSmartPointer<vtkColorTransferFunction> lut =
vtkSmartPointer<vtkColorTransferFunction>::New();
lut->SetColorSpaceToHSV();
// Use a color series to create a transfer function
int numColors = colorSeries->GetNumberOfColors();
for (int i = 0; i < numColors; i++)
{
vtkColor3ub color = colorSeries->GetColor(i);
double dColor[3];
dColor[0] = static_cast<double> (color[0]) / 255.0;
dColor[1] = static_cast<double> (color[1]) / 255.0;
dColor[2] = static_cast<double> (color[2]) / 255.0;
double t = scalarRange[0] + (scalarRange[1] - scalarRange[0]) /
(numColors - 1) * i;
lut->AddRGBPoint(t, dColor[0], dColor[1], dColor[2]);
}
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(curvaturesFilter->GetOutputPort());
mapper->SetLookupTable(lut);
mapper->SetScalarRange(scalarRange);
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// Create a scalar bar
vtkSmartPointer<vtkScalarBarActor> scalarBar =
vtkSmartPointer<vtkScalarBarActor>::New();
scalarBar->SetLookupTable(mapper->GetLookupTable());
scalarBar->SetTitle(curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName());
scalarBar->SetNumberOfLabels(5);
// Create a renderer, render window, and interactor
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actors to the scene
renderer->AddActor(actor);
renderer->AddActor2D(scalarBar);
renderer->SetBackground(.1, .2, .3); // Background color blue
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
--
View this message in context: http://vtk.1045678.n5.nabble.com/Problem-with-Compute-Gaussian-Mean-Minm-and-Max-Curvatures-example-tp5728377p5728392.html
Sent from the VTK - Users mailing list archive at Nabble.com.
More information about the vtkusers
mailing list