[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